1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*-------------------------------------------------------------------------- 20c95c078771f637924fa7ae01b0d90df285dde64Ray EssickCopyright (c) 2010 - 2016, The Linux Foundation. All rights reserved. 3826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRedistribution and use in source and binary forms, with or without 5826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevmodification, are permitted provided that the following conditions are met: 6826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * Redistributions of source code must retain the above copyright 7826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev notice, this list of conditions and the following disclaimer. 8826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev * Redistributions in binary form must reproduce the above copyright 9826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev notice, this list of conditions and the following disclaimer in the 10826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev documentation and/or other materials provided with the distribution. 116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal * Neither the name of The Linux Foundation nor 12826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev the names of its contributors may be used to endorse or promote 13826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev products derived from this software without specific prior written 14826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev permission. 15826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 16826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevNON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 20826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev--------------------------------------------------------------------------*/ 28826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 29826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*============================================================================ 30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev O p e n M A X w r a p p e r s 31826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev O p e n M A X C o r e 32826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 33826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev This module contains the implementation of the OpenMAX core & component. 34826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*//*========================================================================*/ 36826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 37826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev////////////////////////////////////////////////////////////////////////////// 38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Include Files 39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev////////////////////////////////////////////////////////////////////////////// 40826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 41f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#define __STDC_FORMAT_MACROS 42f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#include <inttypes.h> 43f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <string.h> 45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <pthread.h> 46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/prctl.h> 478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <stdlib.h> 48826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <unistd.h> 49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <errno.h> 50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "omx_vdec.h" 51826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <fcntl.h> 52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <limits.h> 5361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include <stdlib.h> 54576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon#include <media/hardware/HardwareAPI.h> 556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <media/msm_media_info.h> 56e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <sys/eventfd.h> 57240fc6e79b5c531171a420124ca6c78bff821a7bMathias Agopian#include <nativebase/nativebase.h> 58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_ 60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/ioctl.h> 61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/mman.h> 62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_ 63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <cutils/properties.h> 66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef USE_EGL_IMAGE_GPU 67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <qdMetaData.h> 70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef ANDROID_JELLYBEAN_MR2 728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include "QComOMXMetadata.h" 738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif 748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h> 77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h> 788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define EGL_BUFFER_HANDLE 0x4F00 798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define EGL_BUFFER_OFFSET 0x4F01 80073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava#endif 816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define BUFFER_LOG_LOC "/data/misc/media" 838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile; 86f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavanchar output_extradata_filename [] = "/data/misc/media/extradata"; 87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30 90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120 918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEFAULT_WIDTH_ALIGNMENT 128 928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEFAULT_HEIGHT_ALIGNMENT 32 93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE 0xC5000000 95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE_MASK 0xFF000000 96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_AP_SEQ_START_CODE 0x0F010000 97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_PROFILE_MASK 0xF0 98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_LEVEL_MASK 0xE0000000 99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE 0 100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_MAIN_PROFILE 1 101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_ADVANCE_PROFILE 3 102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_LOW_LEVEL 0 103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_MED_LEVEL 2 104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_LEN 4 105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_POS 8 106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_A_POS 12 107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_POS 24 108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SEQ_LAYER_SIZE 36 1096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define POLL_TIMEOUT 0x7fffffff 110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/ion" 112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 11461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanextern "C" { 11561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include<utils/Log.h> 11661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan} 117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif//_ANDROID_ 118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_4K 0x1000 1206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_1M 0x100000 1216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } } 123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); } 124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define EXTRADATA_IDX(__num_planes) ((__num_planes) ? (__num_planes) - 1 : 0) 125f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#define ALIGN(x, to_align) ((((unsigned) x) + (to_align - 1)) & ~(to_align - 1)) 126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 127da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA | OMX_DISPLAY_INFO_EXTRADATA) 128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define DEFAULT_CONCEAL_COLOR "32784" //0x8010, black by default 129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef ION_FLAG_CP_BITSTREAM 131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define ION_FLAG_CP_BITSTREAM 0 132115f87fd886c61972b220c6ed94fc74ca1911cf6Praveen Chavan#endif 133115f87fd886c61972b220c6ed94fc74ca1911cf6Praveen Chavan 134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef ION_FLAG_CP_PIXEL 135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define ION_FLAG_CP_PIXEL 0 136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 1378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef MASTER_SIDE_CP 139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define MEM_HEAP_ID ION_SECURE_HEAP_ID 140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SECURE_ALIGN SZ_4K 141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SECURE_FLAGS_INPUT_BUFFER (ION_SECURE | ION_FLAG_CP_BITSTREAM) 142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SECURE_FLAGS_OUTPUT_BUFFER (ION_SECURE | ION_FLAG_CP_PIXEL) 143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else //SLAVE_SIDE_CP 144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define MEM_HEAP_ID ION_CP_MM_HEAP_ID 145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SECURE_ALIGN SZ_1M 146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SECURE_FLAGS_INPUT_BUFFER ION_SECURE 147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SECURE_FLAGS_OUTPUT_BUFFER ION_SECURE 148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 1498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 1508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstatic OMX_U32 maxSmoothStreamingWidth = 1920; 1518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstatic OMX_U32 maxSmoothStreamingHeight = 1088; 1528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input) 154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer; 15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct pollfd pfds[2]; 15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer v4l2_buf; 15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event dqevent; 16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec *omx = reinterpret_cast<omx_vdec*>(input); 162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pfds[0].events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pfds[1].events = POLLIN | POLLERR; 164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pfds[0].fd = omx->drv_ctx.video_driver_fd; 165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pfds[1].fd = omx->m_poll_efd; 16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0; 1678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: Async thread start"); 16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0); 169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (!omx->async_thread_force_stop) { 170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = poll(pfds, 2, POLL_TIMEOUT); 17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!rc) { 1728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Poll timedout"); 17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (rc < 0 && errno != EINTR && errno != EAGAIN) { 175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Error while polling: %d, errno = %d", rc, errno); 17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((pfds[1].revents & POLLIN) || (pfds[1].revents & POLLERR)) { 179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("async_message_thread interrupted to be exited"); 180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((pfds[0].revents & POLLIN) || (pfds[0].revents & POLLRDNORM)) { 18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 1848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan memset(&vdec_msg, 0, sizeof(vdec_msg)); 18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.memory = V4L2_MEMORY_USERPTR; 18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.length = omx->drv_ctx.num_planes; 18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.m.planes = plane; 189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) { 19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE; 19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf; 19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.len=plane[0].bytesused; 19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr; 19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) + 19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (uint64_t)v4l2_buf.timestamp.tv_usec; 19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (vdec_msg.msgdata.output_frame.len) { 19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2]; 19961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3]; 20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4]; 20161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5]; 202f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg.msgdata.output_frame.picsize.frame_width = plane[0].reserved[6]; 203f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg.msgdata.output_frame.picsize.frame_height = plane[0].reserved[7]; 20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 20861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 21061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((pfds[0].revents & POLLOUT) || (pfds[0].revents & POLLWRNORM)) { 21261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 21461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.memory = V4L2_MEMORY_USERPTR; 21561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.length = 1; 21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf.m.planes = plane; 217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) { 21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE; 21961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf; 22161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 22361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 22461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 22661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pfds[0].revents & POLLPRI) { 228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(pfds[0].fd, VIDIOC_DQEVENT, &dqevent); 22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) { 23061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data; 232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED; 234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg.status_code=VDEC_S_SUCCESS; 235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg.msgdata.output_frame.picsize.frame_height = ptr[0]; 236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg.msgdata.output_frame.picsize.frame_width = ptr[1]; 237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VIDC Port Reconfig received insufficient"); 238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omx->async_message_process(input,&vdec_msg) < 0) { 239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("async_message_thread Exited"); 240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_BITDEPTH_CHANGED_INSUFFICIENT ) { 243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdec_msginfo vdec_msg; 24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED; 24561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->dpb_bit_depth = dqevent.u.data[0]; 247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VIDC Port Reconfig Bitdepth change - %d", dqevent.u.data[0]); 24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 25161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) { 25361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 25461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE; 25561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved"); 25761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 25961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 26061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 26161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE; 26261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 2638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved"); 26461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 26761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 268f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_OVERLOAD) { 269f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan struct vdec_msginfo vdec_msg; 270f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_HW_OVERLOAD; 271f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 272f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("HW Overload received"); 273f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 274f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 275f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 276f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 277f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED) { 278f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan struct vdec_msginfo vdec_msg; 279f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg.msgcode=VDEC_MSG_EVT_HW_UNSUPPORTED; 280f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg.status_code=VDEC_S_SUCCESS; 281f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("HW Unsupported received"); 282f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 283f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 284f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 285f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 28661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) { 28761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo vdec_msg; 288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg.msgcode = VDEC_MSG_EVT_HW_ERROR; 289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg.status_code = VDEC_S_SUCCESS; 2908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("SYS Error Recieved"); 29161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->async_message_process(input,&vdec_msg) < 0) { 2928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exited"); 29361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 29461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 295576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE) { 2968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data; 2978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 2988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("REFERENCE RELEASE EVENT RECVD fd = %d offset = %d", ptr[0], ptr[1]); 299576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER) { 3008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data; 301576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon struct vdec_msginfo vdec_msg; 302576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 3038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Release unqueued buffer event recvd fd = %d offset = %d", ptr[0], ptr[1]); 304576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 305576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 306576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon v4l2_buf.memory = V4L2_MEMORY_USERPTR; 307576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon v4l2_buf.length = omx->drv_ctx.num_planes; 308576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon v4l2_buf.m.planes = plane; 309576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon v4l2_buf.index = ptr[5]; 310576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon v4l2_buf.flags = 0; 311576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg.msgcode = VDEC_MSG_RESP_OUTPUT_BUFFER_DONE; 313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg.status_code = VDEC_S_SUCCESS; 314576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon vdec_msg.msgdata.output_frame.client_data = (void*)&v4l2_buf; 315576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon vdec_msg.msgdata.output_frame.len = 0; 3168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan vdec_msg.msgdata.output_frame.bufferaddr = (void*)(intptr_t)ptr[2]; 3178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan vdec_msg.msgdata.output_frame.time_stamp = ((uint64_t)ptr[3] * (uint64_t)1000000) + 318576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon (uint64_t)ptr[4]; 319576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon if (omx->async_message_process(input,&vdec_msg) < 0) { 3208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("async_message_thread Exitedn"); 321576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon break; 322576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 3248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("VIDC Some Event recieved"); 32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan continue; 32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: Async thread stop"); 33061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input) 334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec* omx = reinterpret_cast<omx_vdec*>(input); 33661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char id; 33761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int n; 338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fd_set readFds; 340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int res = 0; 341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct timeval tv; 342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: message thread start"); 34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0); 345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (!omx->message_thread_stop) { 346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin tv.tv_sec = 2; 348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin tv.tv_usec = 0; 349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin FD_ZERO(&readFds); 351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin FD_SET(omx->m_pipe_in, &readFds); 352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin res = select(omx->m_pipe_in + 1, &readFds, NULL, NULL, &tv); 354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (res < 0) { 355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("select() ERROR: %s", strerror(errno)); 356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin continue; 357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (res == 0 /*timeout*/ || omx->message_thread_stop) { 358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin continue; 359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 36161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan n = read(omx->m_pipe_in, &id, 1); 362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 36361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == n) { 36461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 36561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 36761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (1 == n) { 36861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->process_event_cb(omx, id); 36961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 37161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((n < 0) && (errno != EINTR)) { 3728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno); 37361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 37461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("omx_vdec: message thread stop"); 37761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 0; 378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id) 381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret_value; 3838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out); 38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret_value = write(omx->m_pipe_out, &id, 1); 385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret_value <= 0) { 386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("post_message to pipe failed : %s", strerror(errno)); 387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value); 389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor 393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue() 394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 39561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Nothing to do 396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor 399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0) 400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE); 402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert 4058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::omx_cmd_queue::insert_entry(unsigned long p1, unsigned long p2, unsigned long id) 406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) { 40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].id = id; 41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].param1 = p1; 41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_q[m_write].param2 = p2; 41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_write++; 41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_size ++; 41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) { 41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_write = 0; 41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 4198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__); 42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 42161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop 4258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::omx_cmd_queue::pop_entry(unsigned long *p1, unsigned long *p2, unsigned long *id) 426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_size > 0) { 42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *id = m_q[m_read].id; 43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *p1 = m_q[m_read].param1; 43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *p2 = m_q[m_read].param2; 43261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the read pointer ahead 43361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ++m_read; 43461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan --m_size; 43561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) { 43661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_read = 0; 43761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 43861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 44061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 44161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue 445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type() 446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return m_q[m_read].id; 448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list() 452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 45361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //initialize timestamps array 45461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) ); 455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list() 457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 45861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //free m_ts_arr_list? 459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts) 462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 46361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 46461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool duplicate_ts = false; 46561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 46661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 46761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //insert at the first available empty location 46861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 46961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_ts_arr_list[idx].valid) { 47061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //found invalid or empty entry, save timestamp 47161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].valid = true; 47261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].timestamp = ts; 47361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)", 47461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts, idx); 47561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 47761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) { 48061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert"); 48161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 48361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts) 487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 48861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int min_idx = -1; 49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_TICKS min_ts = 0; 49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_ts_arr_list[idx].valid) { 49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //found valid entry, save index 49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (min_idx < 0) { 49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //first valid entry 49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_ts = m_ts_arr_list[idx].timestamp; 50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_idx = idx; 50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_ts_arr_list[idx].timestamp < min_ts) { 50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_ts = m_ts_arr_list[idx].timestamp; 50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan min_idx = idx; 50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (min_idx < 0) { 51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //no valid entries found 51161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop"); 51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts = 0; 51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = false; 51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts = m_ts_arr_list[min_idx].timestamp; 51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[min_idx].valid = false; 51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)", 51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ts, min_idx); 51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 52161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list() 527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool ret = true; 52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int idx = 0; 53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list"); 53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ts_arr_list[idx].valid = false; 53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances 540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void) 541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return (new omx_vdec); 543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base, 548f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ion_user_handle_t handle, int ionMapfd) 549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 5508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) devicefd; 5518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) size; 5528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) base; 5538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) handle; 5548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) ionMapfd; 55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd); 556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base) 559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // dup file descriptor, map once, use pmem 561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev init(dup(fd), base, size, 0 , MEM_DEVICE); 562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_ 565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::omx_vdec 568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 57061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Constructor 571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None 574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 57561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 57661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::omx_vdec(): m_error_propogated(false), 57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state(OMX_StateInvalid), 58061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_app_data(NULL), 58161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr(NULL), 58261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr(NULL), 58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress (false), 58461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress (false), 58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_use_buffer (false), 58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_use_buffer (false), 58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers(false), 58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem(OMX_FALSE), 58961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_region_smi(OMX_FALSE), 59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_pvt_entry_pmem(OMX_FALSE), 59161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers(0), 59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers(0), 59361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count(0), 59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bm_count(0), 59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated(OMX_FALSE), 59661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bPopulated(OMX_FALSE), 59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_flags(0), 598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 59961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr(NULL), 600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 60161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled(OMX_TRUE), 60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled(OMX_TRUE), 60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_in_alloc_cnt(0), 60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list(NULL), 60561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry(NULL), 60661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info(NULL), 6078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan h264_parser(NULL), 60861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes (true), 60961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame (NULL), 61061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame (NULL), 61161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr (NULL), 61261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr(NULL), 61361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_inp_bm_count (0), 61461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse ((codec_type)0), 61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame_meta (true), 61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count (0), 61761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count (0), 61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length(0), 61961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal (false), 62061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame(0), 62161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_buffer(NULL), 62261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame_size (0), 62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_device_file_ptr(NULL), 62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vc1_profile((vc1_profile_type)0), 62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts(LLONG_MAX), 62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags(0), 6278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_disp_hor_size(0), 6288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_disp_vert_size(0), 62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts(LLONG_MAX), 630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prev_ts_actual(LLONG_MAX), 63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts(true), 63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int(0), 63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan in_reconfig(false), 63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_display_id(NULL), 63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata(0), 63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_reject_avc_1080p_mp (0), 637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_enable_android_native_buffers(OMX_FALSE), 63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_android_native_buffers(OMX_FALSE), 640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr(NULL), 64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan secure_mode(false), 6434173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan allocate_native_handle(false), 6448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_other_extradata(NULL), 6458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_profile(0), 646576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon client_set_fps(false), 6478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_last_rendered_TS(-1), 648f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_queued_codec_config_count(0), 649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin current_perf_level(V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL), 650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin secure_scaling_to_non_secure_opb(false), 6510c95c078771f637924fa7ae01b0d90df285dde64Ray Essick m_force_compressed_for_dpb(false) 652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_pipe_in = -1; 654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_pipe_out = -1; 655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_poll_efd = -1; 656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_driver_fd = -1; 657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.extradata_info.ion.fd_ion_data.fd = -1; 65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Assumption is that , to begin with , we have all the frames with decoder */ 659f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("In %u bit OMX vdec Constructor", (unsigned int)sizeof(long) * 8); 6608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan memset(&m_debug,0,sizeof(m_debug)); 661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char property_value[PROPERTY_VALUE_MAX] = {0}; 6638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_get("vidc.debug.level", property_value, "1"); 6648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan debug_level = atoi(property_value); 6658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_value[0] = '\0'; 6668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 6678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("In OMX vdec Constructor"); 6688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 66961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.perf", property_value, "0"); 67061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan perf_flag = atoi(property_value); 67161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag); 67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 67461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms = latency = 0; 67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 67661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_n_filled_len = 0; 67761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_value[0] = '\0'; 67861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.ts", property_value, "0"); 67961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_timestamp = atoi(property_value); 68061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp); 68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(true); 68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.enable_debug_print(true); 68461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 68561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_value[0] = '\0'; 68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.concealedmb", property_value, "0"); 68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_concealedmb = atoi(property_value); 68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb); 69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_value[0] = '\0'; 69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.profile.check", property_value, "0"); 69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_reject_avc_1080p_mp = atoi(property_value); 69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.profile.check value is %d",m_reject_avc_1080p_mp); 695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_value[0] = '\0'; 6978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_get("vidc.dec.log.in", property_value, "0"); 6988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.in_buffer_log = atoi(property_value); 6998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 7008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_value[0] = '\0'; 7018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_get("vidc.dec.log.out", property_value, "0"); 7028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.out_buffer_log = atoi(property_value); 703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC); 704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property_value[0] = '\0'; 706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property_get("vidc.dec.meta.log.out", property_value, "0"); 707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_debug.out_meta_buffer_log = atoi(property_value); 708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC); 7098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 7108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_value[0] = '\0'; 7118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_get("vidc.log.loc", property_value, ""); 7128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (*property_value) 7138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan strlcpy(m_debug.log_loc, property_value, PROPERTY_VALUE_MAX); 7148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 7158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_value[0] = '\0'; 7168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_get("vidc.dec.120fps.enabled", property_value, "0"); 7178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 7188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan //if this feature is not enabled then reset this value -ve 7198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if(atoi(property_value)) { 7208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("feature 120 FPS decode enabled"); 7218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_last_rendered_TS = 0; 7228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 7238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 7248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_value[0] = '\0'; 7258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_get("vidc.dec.debug.dyn.disabled", property_value, "0"); 7268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_disable_dynamic_buf_mode = atoi(property_value); 7278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.dyn.disabled value is %d",m_disable_dynamic_buf_mode); 7288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _UBWC_ 730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property_value[0] = '\0'; 731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property_get("debug.gralloc.gfx_ubwc_disable", property_value, "0"); 732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_disable_ubwc_mode = atoi(property_value); 733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("UBWC mode is %s", m_disable_ubwc_mode ? "disabled" : "enabled"); 734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else 735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_disable_ubwc_mode = true; 736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_cmp,0,sizeof(m_cmp)); 73961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_cb,0,sizeof(m_cb)); 74061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (&drv_ctx,0,sizeof(drv_ctx)); 74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE)); 74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset (m_hwdevice_name,0,sizeof(m_hwdevice_name)); 74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 744f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memset(&m_custom_buffersize, 0, sizeof(m_custom_buffersize)); 745ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan memset(&m_client_color_space, 0, sizeof(DescribeColorAspectsParams)); 746ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan memset(&m_internal_color_space, 0, sizeof(DescribeColorAspectsParams)); 74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan msg_thread_id = 0; 74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan async_thread_id = 0; 75061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan msg_thread_created = false; 75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan async_thread_created = false; 752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_thread_force_stop = false; 753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin message_thread_stop = false; 7546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_ 75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 7566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info)); 7588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 7598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan /* invalidate m_frame_pack_arrangement */ 7608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan memset(&m_frame_pack_arrangement, 0, sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT)); 7618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_frame_pack_arrangement.cancel_flag = 1; 7628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 76361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.timestamp_adjust = false; 76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_vendor_config.pData = NULL; 76561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init(&m_lock, NULL); 76661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_init(&c_lock, NULL); 76797e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan pthread_mutex_init(&buf_lock, NULL); 76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_init(&m_cmd_lock,0,0); 7698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan sem_init(&m_safe_flush, 0, 0); 77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = 77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[OUTPUT_PORT] = false; 772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char extradata_value[PROPERTY_VALUE_MAX] = {0}; 77461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("vidc.dec.debug.extradata", extradata_value, "0"); 77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_debug_extradata = atoi(extradata_value); 77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata); 777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB; 77961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_buffers.set_vdec_client(this); 780576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon dynamic_buf_mode = false; 7818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan out_dynamic_list = NULL; 7828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan is_down_scalar_enabled = false; 783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_downscalar_width = 0; 784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_downscalar_height = 0; 785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_force_down_scalar = 0; 786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_reconfig_height = 0; 787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_reconfig_width = 0; 7888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_smoothstreaming_mode = false; 7898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_smoothstreaming_width = 0; 7908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_smoothstreaming_height = 0; 7917ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan m_decode_order_mode = false; 7928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan is_q6_platform = false; 793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_perf_control.send_hint_to_mpctl(true); 794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_input_pass_buffer_fd = false; 795c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan m_client_color_space.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX; 796ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan m_client_color_space.sAspects.mRange = ColorAspects::RangeUnspecified; 797ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan m_client_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified; 798ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan m_client_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified; 799ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan m_client_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified; 800c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan 801c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan m_internal_color_space.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX; 802c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan m_internal_color_space.sAspects.mRange = ColorAspects::RangeUnspecified; 803c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan m_internal_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified; 804c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan m_internal_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified; 805c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan m_internal_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified; 806c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan m_internal_color_space.nSize = sizeof(DescribeColorAspectsParams); 8076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 8086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 8096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic const int event_type[] = { 81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_FLUSH_DONE, 81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT, 81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT, 813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_BITDEPTH_CHANGED_INSUFFICIENT, 814576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE, 815576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER, 816f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan V4L2_EVENT_MSM_VIDC_SYS_ERROR, 817f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan V4L2_EVENT_MSM_VIDC_HW_OVERLOAD, 818f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED 8196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}; 8206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 8216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE subscribe_to_events(int fd) 8226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 82361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event_subscription sub; 82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int array_sz = sizeof(event_type)/sizeof(int); 82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i,rc; 82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 8288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid input: %d", fd); 82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < array_sz; ++i) { 83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 8378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type); 83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < array_sz) { 84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (--i; i >=0 ; i--) { 84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) 8478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNotImplemented; 85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE unsubscribe_to_events(int fd) 8566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_event_subscription sub; 85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int array_sz = sizeof(event_type)/sizeof(int); 86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int i,rc; 86161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 8628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid input: %d", fd); 86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < array_sz; ++i) { 86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&sub, 0, sizeof(sub)); 86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sub.type = event_type[i]; 86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 8718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 8766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 8776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::~omx_vdec 881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 88261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Destructor 884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None 887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec() 892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = NULL; 89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("In OMX vdec Destructor"); 895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (msg_thread_created) { 896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Signalling close to OMX Msg Thread"); 897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin message_thread_stop = true; 898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_message(this, OMX_COMPONENT_CLOSE_MSG); 899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit"); 900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_join(msg_thread_id,NULL); 901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(m_pipe_in); 903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(m_pipe_out); 90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_in = -1; 90561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_out = -1; 90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit"); 907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eventfd_write(m_poll_efd, 1)) { 908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("eventfd_write failed for fd: %d, errno = %d, force stop async_thread", m_poll_efd, errno); 909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_thread_force_stop = true; 91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (async_thread_created) 91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_join(async_thread_id,NULL); 91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsubscribe_to_events(drv_ctx.video_driver_fd); 915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(m_poll_efd); 91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.video_driver_fd); 91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy(&m_lock); 91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_destroy(&c_lock); 91997e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan pthread_mutex_destroy(&buf_lock); 92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_destroy(&m_cmd_lock); 92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME"); 92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.end(); 92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_INFO("Exit OMX vdec Destructor: fd=%d",drv_ctx.video_driver_fd); 926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_perf_control.send_hint_to_mpctl(false); 927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type) 93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 93561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = 0; 93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 9388b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan } else if(buffer_type == VDEC_BUFFER_TYPE_INPUT) { 9398b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 9408b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan bufreq.count = 0; 9418b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 9428b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 9456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 9466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 947e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdec::set_dpb(bool is_split_mode, int dpb_color_format) 948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc = 0; 950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_ext_control ctrl[2]; 951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_ext_controls controls; 952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("DPB mode: %s DPB color format: %s OPB color format: %s", 954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin is_split_mode ? "split" : "combined", 955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC ? "nv12_ubwc": 956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC ? "nv12_10bit_ubwc": 957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE ? "same as opb": 958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "unknown", 959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin capture_capability == V4L2_PIX_FMT_NV12 ? "nv12": 960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin capture_capability == V4L2_PIX_FMT_NV12_UBWC ? "nv12_ubwc": 961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "unknown"); 962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_MODE; 964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (is_split_mode) { 965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_SECONDARY; 966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_PRIMARY; 968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_DPB_COLOR_FORMAT; 971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ctrl[1].value = dpb_color_format; 972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin controls.count = 2; 974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin controls.ctrl_class = V4L2_CTRL_CLASS_MPEG; 975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin controls.controls = ctrl; 976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_EXT_CTRLS, &controls); 978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc) { 979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to set ext ctrls for opb_dpb: %d\n", rc); 980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorUnsupportedSetting; 981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 986e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdec::decide_dpb_buffer_mode(bool force_split_mode) 987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool cpu_access = capture_capability != V4L2_PIX_FMT_NV12_UBWC; 991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool is_res_above_1080p = (drv_ctx.video_resolution.frame_width > 1920 && 993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution.frame_height > 1088) || 994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (drv_ctx.video_resolution.frame_height > 1088 && 995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution.frame_width > 1920); 996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (cpu_access) { 998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) { 999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_force_compressed_for_dpb || is_res_above_1080p) && 1000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !force_split_mode) { 1001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //split DPB-OPB 1002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DPB -> UBWC , OPB -> Linear 1003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC); 1004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (force_split_mode) { 1005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DPB -> Linear, OPB -> Linear 1006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE); 1007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 1008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DPB-OPB combined linear 1009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE); 1010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) { 1012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //split DPB-OPB 1013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DPB -> UBWC, OPB -> Linear 1014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC); 1015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { //no cpu access 1017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) { 1018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (force_split_mode) { 1019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //split DPB-OPB 1020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DPB -> UBWC, OPB -> UBWC 1021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC); 1022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 1023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DPB-OPB combined UBWC 1024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE); 1025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) { 1027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //split DPB-OPB 1028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DPB -> UBWC, OPB -> UBWC 1029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC); 1030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (eRet) { 1033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Failed to set DPB buffer mode: %d", eRet); 1034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 1036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_vdec::enable_downscalar() 1039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc = 0; 1041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_control control; 1042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_format fmt; 1043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (is_down_scalar_enabled) { 1045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("%s: already enabled", __func__); 1046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return 0; 1047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdec::enable_downscalar"); 1050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = decide_dpb_buffer_mode(true); 1051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc) { 1052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s: decide_dpb_buffer_mode Failed ", __func__); 1053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin is_down_scalar_enabled = true; 1056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&control, 0x0, sizeof(struct v4l2_control)); 1058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.id = V4L2_CID_MPEG_VIDC_VIDEO_KEEP_ASPECT_RATIO; 1059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.value = 1; 1060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 1061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc) { 1062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s: Failed to set VIDEO_KEEP_ASPECT_RATIO", __func__); 1063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return 0; 1067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_vdec::disable_downscalar() 1070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc = 0; 1072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_control control; 1073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!is_down_scalar_enabled) { 1075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdec::disable_downscalar: already disabled"); 1076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return 0; 1077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = decide_dpb_buffer_mode(false); 1080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc < 0) { 1081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s:decide_dpb_buffer_mode failed\n", __func__); 1082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin is_down_scalar_enabled = false; 1085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_vdec::decide_downscalar() 1090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc = 0; 1092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_format fmt; 1093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin enum color_fmts color_format; 1094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!m_downscalar_width || !m_downscalar_height) { 1096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("%s: downscalar not supported", __func__); 1097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return 0; 1098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_force_down_scalar) { 1101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("%s: m_force_down_scalar %d ", __func__, m_force_down_scalar); 1102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return 0; 1103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&fmt, 0x0, sizeof(struct v4l2_format)); 1106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = capture_capability; 1108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 1109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc < 0) { 1110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__); 1111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("%s: driver wxh = %dx%d, downscalar wxh = %dx%d", __func__, 1115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, m_downscalar_width, m_downscalar_height); 1116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (fmt.fmt.pix_mp.width * fmt.fmt.pix_mp.height > m_downscalar_width * m_downscalar_height) { 1118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = enable_downscalar(); 1119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc < 0) { 1120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__); 1121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 width = m_downscalar_width > fmt.fmt.pix_mp.width ? 1125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width : m_downscalar_width; 1126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 height = m_downscalar_height > fmt.fmt.pix_mp.height ? 1127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height : m_downscalar_height; 1128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (capture_capability) { 1129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_NV12: 1130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin color_format = COLOR_FMT_NV12; 1131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_NV12_UBWC: 1133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin color_format = COLOR_FMT_NV12_UBWC; 1134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_NV12_TP10_UBWC: 1136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin color_format = COLOR_FMT_NV12_BPP10_UBWC; 1137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 1139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Color format not recognized\n"); 1140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = OMX_ErrorUndefined; 1141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = update_resolution(width, height, 1145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin VENUS_Y_STRIDE(color_format, width), VENUS_Y_SCANLINES(color_format, height)); 1146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc < 0) { 1147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s: update_resolution WxH %dx%d failed \n", __func__, width, height); 1148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 1151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = disable_downscalar(); 1153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc < 0) { 1154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__); 1155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, 1159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[0].bytesperline, fmt.fmt.pix_mp.plane_fmt[0].reserved[0]); 1160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc < 0) { 1161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s: update_resolution WxH %dx%d failed\n", __func__, fmt.fmt.pix_mp.width, 1162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height); 1163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&fmt, 0x0, sizeof(struct v4l2_format)); 1168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 1170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 1171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = capture_capability; 1172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 1173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc) { 1174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s: Failed set format on capture mplane", __func__); 1175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = get_buffer_req(&drv_ctx.op_buf); 1179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc) { 1180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s: Failed to get output buffer requirements", __func__); 1181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 1185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 118861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 118961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::OMXCntrlProcessMsgCb 1190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 119161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 119261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL Client callbacks are generated through this routine. The decoder 119361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan provides the thread context for this routine. 1194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 119561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 119661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ctxt -- Context information related to the self. 119761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id -- Event identifier. This could be any of the following: 119861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1. Command completion event 119961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 2. Buffer done callback event 120061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3. Frame done callback event 1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 120261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 120361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 1204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 120561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 1206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id) 1207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 12088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long p1; // Parameter - 1 12098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long p2; // Parameter - 2 12108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long ident; 121161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned qsize=0; // qsize 121261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec *pThis = (omx_vdec *) ctxt; 121361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 121461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis) { 12158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out", 121661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan __func__); 121761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 1218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 122061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Protect the shared queue data structure 122161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan do { 122261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Read the message id's from the queue*/ 122361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&pThis->m_lock); 122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_cmd_q.m_size; 122561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 12268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pThis->m_cmd_q.pop_entry(&p1, &p2, &ident); 122761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 122961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize == 0 && pThis->m_state != OMX_StatePause) { 123061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_ftb_q.m_size; 123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 12328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pThis->m_ftb_q.pop_entry(&p1, &p2, &ident); 1233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 123461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 123661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize == 0 && pThis->m_state != OMX_StatePause) { 123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_etb_q.m_size; 123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize) { 12398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pThis->m_etb_q.pop_entry(&p1, &p2, &ident); 1240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&pThis->m_lock); 124361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 124461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*process message if we have one*/ 124561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (qsize > 0) { 124661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id = ident; 124761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (id) { 124861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT: 124961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 125061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (p1) { 125161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandStateSet: 125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = (OMX_STATETYPE) p2; 12538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d", 125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state); 125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 125661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL); 125761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 125861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 125961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_EventError: 126061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_StateInvalid) { 12618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid"); 126261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = (OMX_STATETYPE) p2; 126361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 126461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventError, OMX_ErrorInvalidState, p2, NULL); 12658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (p2 == (unsigned long)OMX_ErrorHardware) { 126661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error(); 126761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 126961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventError, p2, (OMX_U32)NULL, NULL ); 127061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 127161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 127261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 127361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandPortDisable: 12748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%lu]", p2); 127561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 127661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 127761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 127861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 127961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 128061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_CORE_OUTPUT_PORT_INDEX) { 128161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 128361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT)) 12848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to release output buffers"); 128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf); 128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->in_reconfig = false; 128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 128861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error(); 129061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 129361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 129561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 129661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_CommandPortEnable: 12978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%lu]", p2); 129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ 129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete, p1, p2, NULL ); 130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 130661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 130761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 130861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 13098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_ETB_ARBITRARY: 131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\ 13148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) { 13158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure"); 131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 131861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 1319f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan case OMX_COMPONENT_GENERATE_ETB: { 1320f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_ERRORTYPE iret; 1321f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan iret = pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1, (OMX_BUFFERHEADERTYPE *)p2); 1322f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (iret == OMX_ErrorInsufficientResources) { 1323f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure due to HW overload"); 1324f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->omx_report_hw_overload (); 1325f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else if (iret != OMX_ErrorNone) { 1326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure"); 1327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1329f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 1331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FTB: 13338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)(intptr_t)p1,\ 13348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) { 13358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure"); 133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 1339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_COMMAND: 134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\ 134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U32)p2,(OMX_PTR)NULL); 134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EBD: 134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) { 13488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure"); 134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) { 135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->time_stamp_dts.remove_time_stamp( 13538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ((OMX_BUFFERHEADERTYPE *)(intptr_t)p1)->nTimeStamp, 135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( pThis->empty_buffer_done(&pThis->m_cmp, 13598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone) { 13608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_buffer_done failure"); 136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: { 13668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan int64_t *timestamp = (int64_t *)(intptr_t)p1; 136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p1) { 136861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->time_stamp_dts.remove_time_stamp(*timestamp, 136961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ?true:false); 137161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(timestamp); 137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FBD: 137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 13778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure"); 137861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( pThis->fill_buffer_done(&pThis->m_cmp, 13808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone ) { 13818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("fill_buffer_done failure"); 138261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH: 13878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Driver flush i/p Port complete"); 138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->input_flush_progress) { 13898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver"); 139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 139161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->execute_input_flush(); 139261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 13948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure"); 139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we need generate event for Flush done*/ 1398a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka pThis->notify_flush_done(ctxt); 1399a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka 140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_IDLE_PENDING)) { 140261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) { 14038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port"); 140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 140561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->streaming[OUTPUT_PORT] = false; 140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->output_flush_progress) { 14098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Input flush done hence issue stop"); 141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 141161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 141261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 141361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 141461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 141561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 141661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 141761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 142161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH: 14228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Driver flush o/p Port complete"); 142361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->output_flush_progress) { 14248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver"); 142561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 142661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->execute_output_flush(); 142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 142861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 14298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed"); 143061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 143261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we need generate event for Flush done*/ 1433a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka pThis->notify_flush_done(ctxt); 1434a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka 143561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 143661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 14378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Internal flush complete"); 143861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags, 143961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 144061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags, 144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) { 144261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event(OMX_CommandPortDisable, 144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 144461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR (&pThis->m_flags, 144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 14478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan BITMASK_CLEAR (&pThis->m_flags, 14488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 144961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 145161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 145261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 145361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) { 145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) { 14558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port"); 145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 145761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 145861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 145961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->streaming[CAPTURE_PORT] = false; 146061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!pThis->input_flush_progress) { 14618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Output flush done hence issue stop"); 146261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 146361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 146561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 146661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 146861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 147061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 147261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_START_DONE: 14748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE"); 147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 147761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 14788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure"); 147961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 148061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 14818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success"); 148261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 14838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Move to executing"); 148461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateExecuting; 148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateExecuting, NULL); 149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (BITMASK_PRESENT(&pThis->m_flags, 149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_PAUSE_PENDING)) { 149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (/*ioctl (pThis->drv_ctx.video_driver_fd, 149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) { 14948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed"); 149561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 149661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 149761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 15008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Event Handler callback is NULL"); 150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_PAUSE_DONE: 15058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE"); 150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed"); 150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->complete_pending_buffer_done_cbs(); 151261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) { 15138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity"); 151461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Send the callback now 151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING); 151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StatePause; 151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 151861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StatePause, NULL); 152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 152361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 152561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_RESUME_DONE: 15298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE"); 153061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 153161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 15328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed"); 153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 153461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 153561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 15368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Moving the decoder to execute state"); 153761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateExecuting; 154061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateExecuting,NULL); 154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 154561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 154661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 154761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 154861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 154961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 155061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 155161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_STOP_DONE: 15528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE"); 155361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 155461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 != VDEC_S_SUCCESS) { 15558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed"); 155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_error (); 155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->complete_pending_buffer_done_cbs(); 155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) { 15608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success"); 156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING); 156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_state = OMX_StateIdle; 15648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Move to Idle State"); 156561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data, 156661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_EventCmdComplete,OMX_CommandStateSet, 156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_StateIdle,NULL); 156861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 156961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 157061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 157161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 157261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 157361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 157461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p2 == OMX_IndexParamPortDefinition) { 1578f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexParamPortDefinition"); 157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->in_reconfig = true; 1580f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else if (p2 == OMX_IndexConfigCommonOutputCrop) { 1581f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexConfigCommonOutputCrop"); 1582f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 1583f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* Check if resolution is changed in smooth streaming mode */ 1584f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (pThis->m_smoothstreaming_mode && 1585f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (pThis->framesize.nWidth != 1586f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_width) || 1587f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (pThis->framesize.nHeight != 1588f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_height)) { 1589f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 1590f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Resolution changed from: wxh = %dx%d to: wxh = %dx%d", 1591f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->framesize.nWidth, 1592f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->framesize.nHeight, 1593f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_width, 1594f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_height); 1595f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 1596f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* Update new resolution */ 1597f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->framesize.nWidth = 1598f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_width; 1599f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->framesize.nHeight = 1600f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_height; 1601f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 1602f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* Update C2D with new resolution */ 1603f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!pThis->client_buffers.update_buffer_req()) { 1604f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Setting C2D buffer requirements failed"); 1605f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 1606f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 1607f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 1608f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* Update new crop information */ 1609f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nLeft = pThis->drv_ctx.frame_size.left; 1610f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nTop = pThis->drv_ctx.frame_size.top; 1611f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nWidth = pThis->drv_ctx.frame_size.right; 1612f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nHeight = pThis->drv_ctx.frame_size.bottom; 1613f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 1614f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* Validate the new crop information */ 1615f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (pThis->rectangle.nLeft + pThis->rectangle.nWidth > 1616f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_width) { 1617f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 1618f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Crop L[%u] + R[%u] > W[%u]", 1619f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nLeft, pThis->rectangle.nWidth, 1620f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_width); 1621f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nLeft = 0; 1622f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 1623f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (pThis->rectangle.nWidth > 1624f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_width) { 1625f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 1626f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Crop R[%u] > W[%u]", 1627f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nWidth, 1628f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_width); 1629f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nWidth = 1630f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_width; 1631f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 1632f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 1633f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (pThis->rectangle.nTop + pThis->rectangle.nHeight > 1634f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_height) { 1635f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 1636f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Crop T[%u] + B[%u] > H[%u]", 1637f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nTop, pThis->rectangle.nHeight, 1638f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_height); 1639f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nTop = 0; 1640f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 1641f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (pThis->rectangle.nHeight > 1642f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_height) { 1643f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 1644f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Crop B[%u] > H[%u]", 1645f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nHeight, 1646f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_height); 1647f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nHeight = 1648f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->drv_ctx.video_resolution.frame_height; 1649f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 1650f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 1651f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Updated Crop Info: L: %u, T: %u, R: %u, B: %u", 1652f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nLeft, pThis->rectangle.nTop, 1653f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->rectangle.nWidth, pThis->rectangle.nHeight); 1654ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } else if (p2 == OMX_QTIIndexConfigDescribeColorAspects) { 1655ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeColorAspects"); 1656f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 1657f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Rxd Invalid PORT_RECONFIG event (%lu)", p2); 1658f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 165961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_debug.outfile) { 1661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fclose(pThis->m_debug.outfile); 1662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_debug.outfile = NULL; 1663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_debug.out_ymeta_file) { 1665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fclose(pThis->m_debug.out_ymeta_file); 1666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_debug.out_ymeta_file = NULL; 1667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_debug.out_uvmeta_file) { 1669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fclose(pThis->m_debug.out_uvmeta_file); 1670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_debug.out_uvmeta_file = NULL; 1671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1673bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch if (pThis->secure_mode && pThis->m_cb.EventHandler && pThis->in_reconfig) { 1674bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch pThis->prefetchNewBuffers(); 1675bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch } 1676bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 1678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin uint32_t frame_data[2]; 1679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin frame_data[0] = (p2 == OMX_IndexParamPortDefinition) ? 1680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_reconfig_height : pThis->rectangle.nHeight; 1681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin frame_data[1] = (p2 == OMX_IndexParamPortDefinition) ? 1682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_reconfig_width : pThis->rectangle.nWidth; 168361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventPortSettingsChanged, p1, p2, (void*) frame_data ); 168561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 168761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 168861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 169061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EOS_DONE: 16918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE"); 169261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_cb.EventHandler) { 169361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag, 169461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL ); 169561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 169661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 169761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 169861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->prev_ts = LLONG_MAX; 169961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->rst_prev_ts = true; 170061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 170161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 17038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR"); 1704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error(); 170561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 170661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING: 17088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING"); 170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pThis->omx_report_unsupported_setting(); 171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 171161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1712f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan case OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD: 1713f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD"); 1714f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pThis->omx_report_hw_overload(); 1715f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 1716f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 1719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&pThis->m_lock); 172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize = pThis->m_cmd_q.m_size; 172361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pThis->m_state != OMX_StatePause) 172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size); 172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&pThis->m_lock); 172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } while (qsize>0); 1727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 1729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 17306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::update_resolution(int width, int height, int stride, int scan_lines) 17316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int format_changed = 0; 17338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((height != (int)drv_ctx.video_resolution.frame_height) || 17348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (width != (int)drv_ctx.video_resolution.frame_width)) { 17358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)", 173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan width, drv_ctx.video_resolution.frame_width, 173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan height,drv_ctx.video_resolution.frame_height); 173861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan format_changed = 1; 173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 17406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.frame_height = height; 17416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.frame_width = width; 17426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.scan_lines = scan_lines; 17436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.video_resolution.stride = stride; 1744f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if(!is_down_scalar_enabled) { 1745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rectangle.nLeft = 0; 1746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rectangle.nTop = 0; 1747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rectangle.nWidth = drv_ctx.video_resolution.frame_width; 1748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rectangle.nHeight = drv_ctx.video_resolution.frame_height; 1749f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return format_changed; 17516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 1752dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand 17536eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::is_video_session_supported() 17546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 175561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", 175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE) && 175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_profile == HIGH_PROFILE || m_profile == MAIN_PROFILE)) { 175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.max_width = 1280; 175961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.max_height = 720; 176061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Set max_width=1280 & max_height=720 for H264 HP/MP"); 176161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((drv_ctx.video_resolution.frame_width * 176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_height > 176561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.max_width * 176661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.max_height) || 176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.video_resolution.frame_width* 176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_height < 176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.min_width * 177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.min_height)) { 177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR( 177261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)", 177361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_width, 177461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_height, 177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.min_width, 177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.min_height, 177761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.max_width, 177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.max_height); 177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorUnsupportedSetting; 178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 17818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("video session supported"); 178261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 17836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 1784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 17858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint omx_vdec::log_input_buffers(const char *buffer_addr, int buffer_len) 17868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{ 17878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_debug.in_buffer_log && !m_debug.infile) { 17888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) { 1789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.m4v", 17908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 1791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) { 1792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.mpg", m_debug.log_loc, 1793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 1794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) { 1795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.263", 17968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 1797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE) || 17988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 1799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.264", 18008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 1801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 1802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.265", 1803f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 1804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) { 1805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1", 18068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 1807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE)) { 1808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1", 18098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 1810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) { 1811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf", 18128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 1813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { 1814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf", 1815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 1816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 1817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.divx", 1818f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 1819f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 18208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.infile = fopen (m_debug.infile_name, "ab"); 18218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!m_debug.infile) { 18228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile_name); 18238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.infile_name[0] = '\0'; 18248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return -1; 18258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 1826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) || 1827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { 18288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct ivf_file_header { 18298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U8 signature[4]; //='DKIF'; 18308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U8 version ; //= 0; 18318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U8 headersize ; //= 32; 18328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 FourCC; 18338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U8 width; 18348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U8 height; 18358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 rate; 18368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 scale; 18378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 length; 18388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U8 unused[4]; 18398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } file_header; 18408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 18418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan memset((void *)&file_header,0,sizeof(file_header)); 18428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan file_header.signature[0] = 'D'; 18438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan file_header.signature[1] = 'K'; 18448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan file_header.signature[2] = 'I'; 18458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan file_header.signature[3] = 'F'; 18468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan file_header.version = 0; 18478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan file_header.headersize = 32; 1848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (drv_ctx.decoder_format) { 1849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDEC_CODECTYPE_VP8: 1850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin file_header.FourCC = 0x30385056; 1851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDEC_CODECTYPE_VP9: 1853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin file_header.FourCC = 0x30395056; 1854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 1856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("unsupported format for VP8/VP9"); 1857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 18598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan fwrite((const char *)&file_header, 18608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan sizeof(file_header),1,m_debug.infile); 18618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 18628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 18638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_debug.infile && buffer_addr && buffer_len) { 1864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) || 1865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { 1866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vpx_ivf_frame_header { 18678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 framesize; 18688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 timestamp_lo; 18698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 timestamp_hi; 1870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } vpx_frame_header; 1871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vpx_frame_header.framesize = buffer_len; 18728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan /* Currently FW doesn't use timestamp values */ 1873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vpx_frame_header.timestamp_lo = 0; 1874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vpx_frame_header.timestamp_hi = 0; 1875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fwrite((const char *)&vpx_frame_header, 1876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(vpx_frame_header),1,m_debug.infile); 18778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 18788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan fwrite(buffer_addr, buffer_len, 1, m_debug.infile); 18798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 18808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return 0; 18818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 18828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 18838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint omx_vdec::log_output_buffers(OMX_BUFFERHEADERTYPE *buffer) { 1884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int buf_index = 0; 1885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin char *temp = NULL; 1886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1887f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (m_debug.out_buffer_log && !m_debug.outfile && buffer->nFilledLen) { 1888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.outfile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.yuv", 18898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 18908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.outfile = fopen (m_debug.outfile_name, "ab"); 18918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!m_debug.outfile) { 18928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to open output file: %s for logging", m_debug.log_loc); 18938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.outfile_name[0] = '\0'; 18948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return -1; 18958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 18968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 1897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_debug.out_meta_buffer_log && !m_debug.out_ymeta_file && !m_debug.out_uvmeta_file 1899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin && buffer->nFilledLen) { 1900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.out_ymetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.ymeta", 1901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 1902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin snprintf(m_debug.out_uvmetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.uvmeta", 1903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 1904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_debug.out_ymeta_file = fopen (m_debug.out_ymetafile_name, "ab"); 1905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_debug.out_uvmeta_file = fopen (m_debug.out_uvmetafile_name, "ab"); 1906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!m_debug.out_ymeta_file || !m_debug.out_uvmeta_file) { 1907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Failed to open output y/uv meta file: %s for logging", m_debug.log_loc); 1908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_debug.out_ymetafile_name[0] = '\0'; 1909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_debug.out_uvmetafile_name[0] = '\0'; 1910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return -1; 1911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((!m_debug.outfile && !m_debug.out_ymeta_file) || !buffer || !buffer->nFilledLen) 1915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return 0; 1916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_index = buffer - m_out_mem_ptr; 1918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr; 1919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) { 1921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Logging UBWC yuv width/height(%u/%u)", 1922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution.frame_width, 1923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution.frame_height); 1924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_debug.outfile) 1926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fwrite(temp, buffer->nFilledLen, 1, m_debug.outfile); 1927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_debug.out_ymeta_file && m_debug.out_uvmeta_file) { 1929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int width = 0, height = 0; 1930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int y_plane, y_meta_plane; 1931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int y_stride = 0, y_sclines = 0; 1932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int y_meta_stride = 0, y_meta_scanlines = 0, uv_meta_stride = 0, uv_meta_scanlines = 0; 1933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int color_fmt = COLOR_FMT_NV12_UBWC; 1934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int i; 1935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int bytes_written = 0; 1936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin width = drv_ctx.video_resolution.frame_width; 1938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin height = drv_ctx.video_resolution.frame_height; 1939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width); 1940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height); 1941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin y_stride = VENUS_Y_STRIDE(color_fmt, width); 1942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin y_sclines = VENUS_Y_SCANLINES(color_fmt, height); 1943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width); 1944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height); 1945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin y_meta_plane = MSM_MEDIA_ALIGN(y_meta_stride * y_meta_scanlines, 4096); 1947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin y_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096); 1948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr; 1950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (i = 0; i < y_meta_scanlines; i++) { 1951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytes_written = fwrite(temp, y_meta_stride, 1, m_debug.out_ymeta_file); 1952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp += y_meta_stride; 1953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + y_meta_plane + y_plane; 1956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(i = 0; i < uv_meta_scanlines; i++) { 1957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytes_written += fwrite(temp, uv_meta_stride, 1, m_debug.out_uvmeta_file); 1958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp += uv_meta_stride; 1959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12 && m_debug.outfile) { 19628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan int stride = drv_ctx.video_resolution.stride; 19638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan int scanlines = drv_ctx.video_resolution.scan_lines; 19648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_smoothstreaming_mode) { 19658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan stride = drv_ctx.video_resolution.frame_width; 19668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan scanlines = drv_ctx.video_resolution.frame_height; 19678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan stride = (stride + DEFAULT_WIDTH_ALIGNMENT - 1) & (~(DEFAULT_WIDTH_ALIGNMENT - 1)); 19688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan scanlines = (scanlines + DEFAULT_HEIGHT_ALIGNMENT - 1) & (~(DEFAULT_HEIGHT_ALIGNMENT - 1)); 19698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 19708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned i; 19718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Logging width/height(%u/%u) stride/scanlines(%u/%u)", 19728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.video_resolution.frame_width, 19738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.video_resolution.frame_height, stride, scanlines); 19748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan int bytes_written = 0; 19758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) { 19768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile); 19778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan temp += stride; 19788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 19798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines; 19808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan int stride_c = stride; 19818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan for(i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) { 19828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile); 19838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan temp += stride_c; 19848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 19858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 19868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return 0; 19878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 19888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 1989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 199161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentInit 1992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 199461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Initialize the component. 1995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 199761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ctxt -- Context information related to the self. 199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id -- Event identifier. This could be any of the following: 199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1. Command completion event 200061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 2. Buffer done callback event 200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3. Frame done callback event 2002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 200361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 200461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 2005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role) 2008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 2009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_fmtdesc fdesc; 201261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 201361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 201461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_frmsizeenum frmsize; 201661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int alignment = 0,buffer_size = 0; 201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fds[2]; 201861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int r,ret=0; 201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool codec_ambiguous = false; 2020f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_STRING device_name = (OMX_STRING)"/dev/video32"; 20218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan char property_value[PROPERTY_VALUE_MAX] = {0}; 2022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin FILE *soc_file = NULL; 2023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin char buffer[10]; 202450ad2f6e2dc3f0fca5f2b9a5d1e2f7b056133036Praveen Chavan 20256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ 202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char platform_name[PROPERTY_VALUE_MAX]; 202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan property_get("ro.board.platform", platform_name, "0"); 202861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(platform_name, "msm8610", 7)) { 202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan device_name = (OMX_STRING)"/dev/video/q6_dec"; 20308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan is_q6_platform = true; 20318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan maxSmoothStreamingWidth = 1280; 20328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan maxSmoothStreamingHeight = 720; 203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 20346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 20356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 2036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin is_thulium_v1 = false; 2037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin soc_file = fopen("/sys/devices/soc0/soc_id", "r"); 2038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (soc_file) { 2039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fread(buffer, 1, 4, soc_file); 2040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fclose(soc_file); 2041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (atoi(buffer) == 246) { 2042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin soc_file = fopen("/sys/devices/soc0/revision", "r"); 2043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (soc_file) { 2044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fread(buffer, 1, 4, soc_file); 2045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fclose(soc_file); 2046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (atoi(buffer) == 1) { 2047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin is_thulium_v1 = true; 2048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("is_thulium_v1 = TRUE"); 2049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 20548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_ 20558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan /* 20568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan * turn off frame parsing for Android by default. 20578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan * Clients may configure OMX_QCOM_FramePacking_Arbitrary to enable this mode 20588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan */ 20598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan arbitrary_bytes = false; 2060f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0"); 2061f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (atoi(property_value)) { 2062f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("arbitrary_bytes mode enabled via property command"); 2063f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan arbitrary_bytes = true; 2064f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 20658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif 20668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 2067f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!strncmp(role, "OMX.qcom.video.decoder.avc.secure", 2068f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 206961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan secure_mode = true; 207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 207161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan role = (OMX_STRING)"OMX.qcom.video.decoder.avc"; 20728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg2.secure", 20738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 20748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan secure_mode = true; 20758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan arbitrary_bytes = false; 20768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg2"; 2077f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else if (!strncmp(role, "OMX.qcom.video.decoder.hevc.secure", 2078f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 2079f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan secure_mode = true; 2080f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan arbitrary_bytes = false; 2081f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan role = (OMX_STRING)"OMX.qcom.video.decoder.hevc"; 2082f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else if (!strncmp(role, "OMX.qcom.video.decoder.vc1.secure", 2083f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 2084f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan secure_mode = true; 2085f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan arbitrary_bytes = false; 2086f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan role = (OMX_STRING)"OMX.qcom.video.decoder.vc1"; 2087f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else if (!strncmp(role, "OMX.qcom.video.decoder.wmv.secure", 2088f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 2089f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan secure_mode = true; 2090f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan arbitrary_bytes = false; 2091f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan role = (OMX_STRING)"OMX.qcom.video.decoder.wmv"; 2092f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg4.secure", 2093f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 2094f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan secure_mode = true; 2095f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan arbitrary_bytes = false; 2096f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg4"; 2097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (!strncmp(role, "OMX.qcom.video.decoder.vp9.secure", 2098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) { 2099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin secure_mode = true; 2100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin arbitrary_bytes = false; 2101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin role = (OMX_STRING)"OMX.qcom.video.decoder.vp9"; 210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 210461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_driver_fd = open(device_name, O_RDWR); 210561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 21068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_INFO("component_init: %s : fd=%d", role, drv_ctx.video_driver_fd); 210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_driver_fd < 0) { 21098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno); 211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 211261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS; 211361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = 1; 2114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_poll_efd = eventfd(0, 0); 2115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_poll_efd < 0) { 2116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to create event fd(%s)", strerror(errno)); 2117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 2118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = subscribe_to_events(drv_ctx.video_driver_fd); 212061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!ret) { 212161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan async_thread_created = true; 212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = pthread_create(&async_thread_id,0,async_message_thread,this); 212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 212461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 21258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to create async_message_thread"); 212661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan async_thread_created = false; 212761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 212861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 21318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan outputExtradataFile = fopen (output_extradata_filename, "ab"); 2132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Copy the role information which provides the decoder kind 213561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy(drv_ctx.kind,role,128); 213661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\ 213861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 213961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.mpeg4",\ 214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 214161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.timestamp_adjust = true; 214261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4; 214361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingMPEG4; 214461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_MPEG4; 214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Start Code for MPEG4*/ 214661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_MPEG4; 2147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_parser.init_start_codes(codec_type_parse); 214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\ 214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.mpeg2",\ 215161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 215261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2; 215361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_MPEG2; 215461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingMPEG2; 215561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Initialize Start Code for MPEG2*/ 215661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_MPEG2; 2157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_parser.init_start_codes(codec_type_parse); 215861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\ 215961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 216061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 21618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("H263 Decoder selected"); 216261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_H263; 216361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingH263; 216461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_H263; 216561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_H263; 2166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_parser.init_start_codes(codec_type_parse); 216761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\ 216861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 216961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 21708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW ("DIVX 311 Decoder selected"); 217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3; 217261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX_311; 217361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 217461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 2175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_parser.init_start_codes(codec_type_parse); 217661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 217761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\ 217861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 217961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 21808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected"); 218161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4; 218261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX; 218361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 218461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 218561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_ambiguous = true; 2186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_parser.init_start_codes(codec_type_parse); 218761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 218861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\ 218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 21918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected"); 219261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6; 219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_DIVX; 219461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 219561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_DIVX; 219661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_ambiguous = true; 2197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_parser.init_start_codes(codec_type_parse); 219861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 219961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\ 220061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 220161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 220261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_H264; 220361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability=V4L2_PIX_FMT_H264; 220461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingAVC; 220561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_H264; 2206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_parser.init_start_codes(codec_type_parse); 220761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 2208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (is_thulium_v1) { 2209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin arbitrary_bytes = true; 2210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Enable arbitrary_bytes for h264"); 2211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 22128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc",\ 22138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 22148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE); 22158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_MVC; 22168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan output_capability = V4L2_PIX_FMT_H264_MVC; 22178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC; 22188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan codec_type_parse = CODEC_TYPE_H264; 22198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_frame_parser.init_start_codes(codec_type_parse); 22208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_frame_parser.init_nal_length(nal_length); 22218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\ 22228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 22238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 22248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC; 22258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan output_capability = V4L2_PIX_FMT_HEVC; 2226f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc; 22278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan codec_type_parse = CODEC_TYPE_HEVC; 22288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_frame_parser.init_start_codes(codec_type_parse); 22298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_frame_parser.init_nal_length(nal_length); 223061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\ 223161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 223261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_VC1; 223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingWMV; 223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VC1; 223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_VC1_ANNEX_G; 2237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_parser.init_start_codes(codec_type_parse); 223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\ 223961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 224061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV; 224261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingWMV; 224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VC1; 224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability = V4L2_PIX_FMT_VC1_ANNEX_L; 2245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_parser.init_start_codes(codec_type_parse); 224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", \ 224761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE)) { 224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 2249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.decoder_format = VDEC_CODECTYPE_VP8; 2250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_capability = V4L2_PIX_FMT_VP8; 22515aa03230fef7a43a61e1ac5f19a2c5a71e5d6df7Praveen Chavan eCompressionFormat = OMX_VIDEO_CodingVP8; 225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse = CODEC_TYPE_VP8; 225361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 2254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", \ 2255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) { 2256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char *)m_cRole, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE); 2257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.decoder_format = VDEC_CODECTYPE_VP9; 2258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_capability = V4L2_PIX_FMT_VP9; 2259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eCompressionFormat = OMX_VIDEO_CodingVP9; 2260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin codec_type_parse = CODEC_TYPE_VP9; 2261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin arbitrary_bytes = false; 226261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 22638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Unknown Component"); 226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 22688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_COLOR_FORMATTYPE dest_color_format; 2269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_disable_ubwc_mode) { 2270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_format = VDEC_YUV_FORMAT_NV12; 2271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 2272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_UBWC; 2273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 22748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (eCompressionFormat == (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC) 22758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan dest_color_format = (OMX_COLOR_FORMATTYPE) 22768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView; 22778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan else 22788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan dest_color_format = (OMX_COLOR_FORMATTYPE) 2279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 22806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (!client_buffers.set_color_format(dest_color_format)) { 22818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setting color format failed"); 22826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet = OMX_ErrorInsufficientResources; 22836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 2284dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand 2285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin dpb_bit_depth = MSM_VIDC_BIT_DEPTH_8; 2286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_disable_ubwc_mode) { 2288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin capture_capability = V4L2_PIX_FMT_NV12; 2289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 2290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin capture_capability = V4L2_PIX_FMT_NV12_UBWC; 2291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 229261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 229361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_capability cap; 229461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap); 229561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 22968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to query capabilities"); 229761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 229861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 2299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Capabilities: driver_name = %s, card = %s, bus_info = %s," 2300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " version = %d, capabilities = %x", cap.driver, cap.card, 2301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin cap.bus_info, cap.version, cap.capabilities); 230261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=0; 230461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index=0; 230661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 23078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 230861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.pixelformat, fdesc.flags); 230961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index++; 231061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 231161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 231261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index=0; 231361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 231461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 23158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 231661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.pixelformat, fdesc.flags); 231761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fdesc.index++; 231861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 23196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal update_resolution(320, 240, 320, 240); 232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 232161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 232261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 232361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 232461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 232561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 232661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 23278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set format on output port"); 232861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 232961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 23308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Set Format was successful"); 233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_ambiguous) { 233261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (output_capability == V4L2_PIX_FMT_DIVX) { 233361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control divx_ctrl; 233461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 233561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) { 233661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4; 233761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) { 233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5; 233961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 234061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6; 234161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 234261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT; 234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl); 234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 23468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set divx version"); 234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 234861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Codec should not be ambiguous"); 235061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 23538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan property_get("persist.vidc.dec.conceal_color", property_value, DEFAULT_CONCEAL_COLOR); 23548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_conceal_color= atoi(property_value); 23558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("trying to set 0x%u as conceal color\n", (unsigned int)m_conceal_color); 23568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONCEAL_COLOR; 23578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.value = m_conceal_color; 23588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 23598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (ret) { 23608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set conceal color %d\n", ret); 23618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 23628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Get the hardware capabilities 236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset((void *)&frmsize,0,sizeof(frmsize)); 236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frmsize.index = 0; 236661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frmsize.pixel_format = output_capability; 236761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, 236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VIDIOC_ENUM_FRAMESIZES, &frmsize); 236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) { 23708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to get framesizes"); 237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 237461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) { 237561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.min_width = frmsize.stepwise.min_width; 237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.max_width = frmsize.stepwise.max_width; 237761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.min_height = frmsize.stepwise.min_height; 237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_decoder_capability.max_height = frmsize.stepwise.max_height; 237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 2381f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memset(&fmt, 0x0, sizeof(struct v4l2_format)); 238261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 238461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 238561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 238661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 23898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set format on capture port"); 239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2391f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memset(&framesize, 0, sizeof(OMX_FRAMESIZETYPE)); 2392f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan framesize.nWidth = drv_ctx.video_resolution.frame_width; 2393f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan framesize.nHeight = drv_ctx.video_resolution.frame_height; 2394f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 2395f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memset(&rectangle, 0, sizeof(OMX_CONFIG_RECTTYPE)); 2396f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan rectangle.nWidth = drv_ctx.video_resolution.frame_width; 2397f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan rectangle.nHeight = drv_ctx.video_resolution.frame_height; 2398f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 23998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Set Format was successful"); 240061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE; 240261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = 1; 24038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret); 24048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 24058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (ret) { 24068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret); 24078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorInsufficientResources; 24088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 24098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 24108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (output_capability == V4L2_PIX_FMT_H264_MVC) { 24118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_MVC_BUFFER_LAYOUT; 24128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_MVC_TOP_BOTTOM; 2413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 241461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 24158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to set MVC buffer layout"); 241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 241761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 241861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 24196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 2420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (is_thulium_v1) { 2421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = enable_smoothstreaming(); 2422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (eRet != OMX_ErrorNone) { 2423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to enable smooth streaming on driver"); 2424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 2425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 242861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Get the Buffer requirements for input and output ports*/ 242961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT; 243061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 2431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 243261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 2433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.alignment = SECURE_ALIGN; 2434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.alignment = SECURE_ALIGN; 243561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 2436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.alignment = SZ_4K; 2437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.alignment = SZ_4K; 243861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 244061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata = 0; 244261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.picture_order = VDEC_ORDER_DISPLAY; 244361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 244461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 244561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 244661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.idr_only_decoding = 0; 2447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _ANDROID_ 2449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property_get("vidc.dec.downscalar_width",property_value,"0"); 2450f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (atoi(property_value)) { 2451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_downscalar_width = atoi(property_value); 2452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property_get("vidc.dec.downscalar_height",property_value,"0"); 2454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (atoi(property_value)) { 2455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_downscalar_height = atoi(property_value); 2456f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 2457f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 2458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_downscalar_width < m_decoder_capability.min_width || 2459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_downscalar_height < m_decoder_capability.min_height) { 2460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_downscalar_width = 0; 2461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_downscalar_height = 0; 2462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Downscaler configured WxH %dx%d\n", 2465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_downscalar_width, m_downscalar_height); 2466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 24676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal m_state = OMX_StateLoaded; 2468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA 2469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", 2470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE) && 2471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", 2472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) && 2473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (eRet == OMX_ErrorNone)) 247469e702b93a3836f881c0dbc70f0813f87607cbb6Arun Menon enable_extradata(DEFAULT_EXTRADATA, true, true); 2475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 2476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = get_buffer_req(&drv_ctx.ip_buf); 2477f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Input Buffer Size =%u",(unsigned int)drv_ctx.ip_buf.buffer_size); 24786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal get_buffer_req(&drv_ctx.op_buf); 24798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 || 24808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC || 24818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) { 248261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size; 248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size); 248461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 248561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nOffset = 0; 248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 24888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed "); 248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 249061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 24918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 24928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 || 24938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) { 24948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_frame_parser.mutils == NULL) { 24958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_frame_parser.mutils = new H264_Utils(); 24968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_frame_parser.mutils == NULL) { 24978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("parser utils Allocation failed "); 24988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = OMX_ErrorInsufficientResources; 24998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 250061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 250161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size); 250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser = new h264_stream_parser(); 250661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!h264_parser) { 250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!"); 250861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 250961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 251161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pipe(fds)) { 25138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("pipe creation failed"); 251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_in = fds[0]; 251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pipe_out = fds[1]; 251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan msg_thread_created = true; 251961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan r = pthread_create(&msg_thread_id,0,message_thread,this); 252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (r < 0) { 25228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("component_init(): message_thread creation failed"); 252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan msg_thread_created = false; 252461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 252561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 25297ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan { 25307ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan VendorExtensionStore *extStore = const_cast<VendorExtensionStore *>(&mVendorExtensionStore); 25317ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan init_vendor_extensions(*extStore); 25327ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan mVendorExtensionStore.dumpExtensions((const char *)role); 25337ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan } 25347ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan 253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone) { 25368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Component Init Failed"); 253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 25388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_INFO("omx_vdec::component_init() success : fd=%d", 25398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.video_driver_fd); 254061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer)); 254261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 2543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 254761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetComponentVersion 2548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns the component version. 2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan TBD. 2554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorNone. 2557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_component_version 256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan( 256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STRING componentName, 256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* componentVersion, 256461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* specVersion, 256561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_UUIDTYPE* componentUUID 256661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 2567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 25688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 25698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) componentName; 25708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) componentVersion; 25718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) componentUUID; 257261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 25738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Comp Version in Invalid State"); 2574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 2575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 257661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* TBD -- Return the proper version */ 257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (specVersion) { 257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan specVersion->nVersion = OMX_SPEC_VERSION; 257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 258061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 2581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommand 2585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 258761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 2588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 2591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 259361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 259561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp, 259761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_COMMANDTYPE cmd, 259861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 param1, 259961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR cmdData 260061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 2601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 26028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 26038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) cmdData; 26048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command: Recieved a Command from Client"); 260561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 26068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State"); 2607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 2608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX 261061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) { 26118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush " 26128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "to invalid port: %u", (unsigned int)param1); 261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 2614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 26158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 2616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND); 2617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sem_wait(&m_cmd_lock); 26188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command: Command Processed"); 2619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 2620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 2621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 2622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 262461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommand 2625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 262661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 262761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 262961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 2631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 263361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 2634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 2636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, 263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_COMMANDTYPE cmd, 263861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 param1, 263961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR cmdData 264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 2641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 26428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 26438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) cmdData; 264461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 264561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STATETYPE eState = (OMX_STATETYPE) param1; 264661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int bFlag = 1,sem_posted = 0,ret=0; 264761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 26488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd); 26498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d", 265061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state, eState); 265161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 265261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (cmd == OMX_CommandStateSet) { 26538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued"); 26548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState); 265561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 265661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Loaded */ 265761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 265861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateLoaded) { 265961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateIdle) { 266061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //if all buffers are allocated or all ports disabled 266161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done() || 266261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) { 26638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle"); 266461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 26658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending"); 266661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING); 266761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 266861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 266961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 267061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 267161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Loaded */ 267261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 26738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded"); 267461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 267561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 267661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 267761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 267861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to WaitForResources */ 267961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 268061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 268161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 26828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources"); 268361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 268461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Executing */ 268561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 26868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing"); 268761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 268861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 268961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 269061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 269161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Pause */ 269261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 26938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause"); 269461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 269561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 269661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 269761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 269861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Loaded to Invalid */ 269961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 27008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid"); 270161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 270261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 270361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 27048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\ 270561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eState); 270661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 270761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 271061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is IDLE */ 271261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 271361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateIdle) { 271461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateLoaded) { 271561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_done()) { 271661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* 271761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Since error is None , we will post an event at the end 271861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan of this function definition 271961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan */ 27208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded"); 272161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 27228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending"); 272361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING); 272461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 272561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 272661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 272761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 272861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Executing */ 272961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 27308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 273161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING); 273261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 27338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state=OMX_StateExecuting; 27358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful"); 273661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 273761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Idle */ 273861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateIdle) { 27398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle"); 274061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 274261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 274361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to WaitForResources */ 274561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 27468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources"); 274761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 274861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 274961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 275161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Pause */ 275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 275361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*To pause the Video core we need to start the driver*/ 275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START, 275561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NULL) < */0) { 27568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED"); 275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorHardware; 275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 27618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause"); 276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 276461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Idle to Invalid */ 276661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 27678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid"); 276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 27718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState); 277261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 277361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 2775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /******************************/ 277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Executing */ 277861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /******************************/ 277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateExecuting) { 27808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting"); 278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Idle */ 278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateIdle) { 278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition 278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan */ 27868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle"); 278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 278961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_ALL); 279261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 279461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Paused */ 279661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 27978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("PAUSE Command Issued"); 279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state = OMX_StatePause; 279961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 280161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Loaded */ 280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 28038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded"); 280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 280561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to WaitForResources */ 280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 28108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources"); 281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 281261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 281361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 281561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Executing */ 281661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 28178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing"); 281861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 281961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 282161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 282261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Executing to Invalid */ 282361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 28248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid"); 282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 282661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 28288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState); 282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 283261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Pause */ 283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StatePause) { 283661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Executing */ 283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateExecuting) { 28388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pause --> Executing"); 283961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state = OMX_StateExecuting; 284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 1; 284161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Idle */ 284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateIdle) { 284461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 28468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pause --> Idle"); 284761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_ALL); 285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to loaded */ 285661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateLoaded) { 28578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> loaded"); 285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 286161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to WaitForResources */ 286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 28648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> WaitForResources"); 286561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 286661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 286761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 286861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Pause */ 287061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 28718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> Pause"); 287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState,\ 287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from Pause to Invalid */ 287761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 28788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pause --> Invalid"); 287961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 28828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState); 288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 288461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 288561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 288661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is WaitForResources */ 288861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /***************************/ 288961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateWaitForResources) { 289061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Loaded */ 289161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == OMX_StateLoaded) { 289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Since error is None , we will post an event 289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan at the end of this function definition */ 28948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded"); 289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 289661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to WaitForResources */ 289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateWaitForResources) { 28988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources"); 289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorSameState, 290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 290161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorSameState; 290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Executing */ 290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateExecuting) { 29058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing"); 290661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 290761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 290861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Pause */ 291161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StatePause) { 29128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause"); 291361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 291561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorIncorrectStateTransition; 291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 291761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Invalid */ 291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (eState == OMX_StateInvalid) { 29198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid"); 292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 292261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 292361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Requesting transition from WaitForResources to Loaded - 292461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan is NOT tested by Khronos TS */ 2925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 292661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState); 292861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 292961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 2930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 293161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /********************************/ 293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Current State is Invalid */ 293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*******************************/ 293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (m_state == OMX_StateInvalid) { 293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* State Transition from Inavlid to any state */ 293661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eState == (OMX_StateLoaded || OMX_StateWaitForResources 293761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || OMX_StateIdle || OMX_StateExecuting 293861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || OMX_StatePause || OMX_StateInvalid)) { 29398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded"); 294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError,OMX_ErrorInvalidState,\ 294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidState; 2943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 294461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (cmd == OMX_CommandFlush) { 29458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued" 29468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "with param1: %u", (unsigned int)param1); 29478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _MSM8974_ 2948a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan send_codec_config(); 29498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif 2950f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (cmd == OMX_CommandFlush && (param1 == OMX_CORE_INPUT_PORT_INDEX || 2951f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan param1 == OMX_ALL)) { 2952f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (android_atomic_add(0, &m_queued_codec_config_count) > 0) { 2953f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan struct timespec ts; 2954f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 2955f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan clock_gettime(CLOCK_REALTIME, &ts); 2956f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ts.tv_sec += 2; 2957f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("waiting for %d EBDs of CODEC CONFIG buffers ", 2958f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_queued_codec_config_count); 2959f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_FLUSH_DEFERRED); 2960f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (sem_timedwait(&m_safe_flush, &ts)) { 2961f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Failed to wait for EBDs of CODEC CONFIG buffers"); 2962f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 2963f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan BITMASK_CLEAR (&m_flags,OMX_COMPONENT_FLUSH_DEFERRED); 2964f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 2965f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 2966f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 296761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); 296961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 297261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 297461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 29758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the Semaphore"); 297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 297761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(param1); 297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( cmd == OMX_CommandPortEnable) { 29818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued" 29828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "with param1: %u", (unsigned int)param1); 298361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled = OMX_TRUE; 298561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (m_state == OMX_StateLoaded && 298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 298861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || allocate_input_done()) { 298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX, 299061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 299161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 29928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending"); 299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING); 299461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 299661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 299761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 299861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 29998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Enable output Port command recieved"); 300061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled = OMX_TRUE; 300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 300261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (m_state == OMX_StateLoaded && 300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 300461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || (allocate_output_done())) { 300561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX, 3006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 3007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 300861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 30098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending"); 301061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 301161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 3013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* enable/disable downscaling if required */ 3014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = decide_downscalar(); 3015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret) { 3016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("decide_downscalar failed\n"); 3017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 301861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 301961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 302061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (cmd == OMX_CommandPortDisable) { 30218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued" 30228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "with param1: %u", (unsigned int)param1); 302361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 3024a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan codec_config_flag = false; 302561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bEnabled = OMX_FALSE; 302661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_input_done()) { 302861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX, 3029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 303061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING); 303261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 303561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX); 303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 304161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 304361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 304461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bEnabled = OMX_FALSE; 30468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Disable output Port command recieved"); 304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_output_done()) { 304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\ 3050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 305161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 305261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_posted = 1; 305661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post (&m_cmd_lock); 305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 305861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX); 306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Skip the event notification 306261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bFlag = 0; 306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 306461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 306561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 30678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd); 306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNotImplemented; 306961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone && bFlag) { 307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT); 307261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!sem_posted) { 307461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sem_post(&m_cmd_lock); 307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 307661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ExecuteOmxFlush 3083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Executes the OMX flush. 3086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 308861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan flushtype - input flush(1)/output flush(0)/ both. 3089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 3092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType) 3095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 309661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 309761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer v4l2_buf; 309961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_decoder_cmd dec; 31008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("in %s, flushing %u", __func__, (unsigned int)flushType); 310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH; 310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("in %s: reconfig? %d", __func__, in_reconfig); 310561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (in_reconfig && flushType == OMX_CORE_OUTPUT_PORT_INDEX) { 310761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = true; 310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 310961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* XXX: The driver/hardware does not support flushing of individual ports 311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * in all states. So we pretty much need to flush both ports internally, 311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it 311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * requested. Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set, 311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * we automatically omit sending the FLUSH done for the "opposite" port. */ 311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = true; 311661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = true; 311761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 3118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin request_perf_level(VIDC_TURBO); 311961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 31228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Flush Port (%u) Failed ", (unsigned int)flushType); 312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = false; 312461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 312661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 3127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*========================================================================= 3129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush 3130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 313261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at OUTPUT PORT. 3133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 313561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone. 3136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false 3139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/ 3140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush() 3141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 31428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long p1 = 0; // Parameter - 1 31438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long p2 = 0; // Parameter - 2 31448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long ident = 0; 314561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = true; 314661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 314761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Generate FBD for all Buffers in the FTBq*/ 314861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 31498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Initiate Output Flush"); 31508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 31518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan //reset last render TS 31528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if(m_last_rendered_TS > 0) { 31538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_last_rendered_TS = 0; 31548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 31558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 315661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_ftb_q.m_size) { 31578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer queue size %lu pending buf cnt %d", 315861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.m_size,pending_output_buffers); 315961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.pop_entry(&p1,&p2,&ident); 31608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ID(%lx) P1(%lx) P2(%lx)", ident, p1, p2); 316161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == m_fill_output_msg ) { 31628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)(intptr_t)p2); 316361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_FBD) { 31648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)(intptr_t)p1); 316561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 316761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 316861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_flush_progress = false; 316961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 317061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 317161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 317261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 317361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 31748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers); 317561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 3176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*========================================================================= 3178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush 3179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION 318161a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at INPUT PORT. 3182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS 318461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone. 3185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE 318761a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false 3188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/ 3189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush() 3190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 319161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i =0; 31928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long p1 = 0; // Parameter - 1 31938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long p2 = 0; // Parameter - 2 31948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long ident = 0; 319561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = true; 319661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 319761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Generate EBD for all Buffers in the ETBq*/ 31988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Initiate Input Flush"); 319961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 320061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 32018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Check if the Queue is empty"); 320261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_etb_q.m_size) { 320361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.pop_entry(&p1,&p2,&ident); 320461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 320561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 32068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 320761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 320861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_ETB) { 320961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers++; 32108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 321161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 321261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 321361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_EBD) { 32148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p", 321561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1); 321661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 321761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 321961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.flush_timestamp(); 322061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Heap Buffers are to be flushed*/ 322161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes && !(codec_config_flag)) { 32228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Reset all the variables before flusing"); 322361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 322461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count = 0; 322561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 322661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count = 0; 322761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 322861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = 0; 322961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 323061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 32318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Initialize parser"); 323261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) { 323361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 323461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 323661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_input_pending_q.m_size) { 323761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&p1,&p2,&ident); 323861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1); 323961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 324161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame) { 324261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame); 324361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 324461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 324661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 324761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 32488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned int)NULL, 324961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned int)NULL); 325061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 325161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 325261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.flush(); 325361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (codec_config_flag) { 325461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer " 325561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "is not sent to the driver yet"); 325661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 325761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 325861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_flush_progress = false; 325961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes) { 326061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 326161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 326261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 326461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 326561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.reset_ts_list(); 326661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 32688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers); 326961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 3270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3272a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka/*========================================================================= 3273a61df3d5c4abd639448faae4e77c1b291938f53aMahesh LankaFUNCTION : notify_flush_done 3274a61df3d5c4abd639448faae4e77c1b291938f53aMahesh LankaDESCRIPTION 3275a61df3d5c4abd639448faae4e77c1b291938f53aMahesh LankaNotifies flush done to the OMX Client. 3276a61df3d5c4abd639448faae4e77c1b291938f53aMahesh LankaPARAMETERS 3277a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lankactxt -- Context information related to the self.. 3278a61df3d5c4abd639448faae4e77c1b291938f53aMahesh LankaRETURN VALUE 3279a61df3d5c4abd639448faae4e77c1b291938f53aMahesh LankaNONE 3280a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka==========================================================================*/ 3281a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lankavoid omx_vdec::notify_flush_done(void *ctxt) { 3282a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka omx_vdec *pThis = (omx_vdec *) ctxt; 3283a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka if (!pThis->input_flush_progress && !pThis->output_flush_progress) { 3284a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka if (BITMASK_PRESENT(&pThis->m_flags, 3285a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) { 3286a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka DEBUG_PRINT_LOW("Notify Output Flush done"); 3287a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 3288a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 3289a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka OMX_EventCmdComplete,OMX_CommandFlush, 3290a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka OMX_CORE_OUTPUT_PORT_INDEX,NULL ); 3291a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka } 3292a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka 3293a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka if (BITMASK_PRESENT(&pThis->m_flags, 3294a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka OMX_COMPONENT_INPUT_FLUSH_PENDING)) { 3295a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING); 3296a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka DEBUG_PRINT_LOW("Input Flush completed - Notify Client"); 3297a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 3298a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka OMX_EventCmdComplete,OMX_CommandFlush, 3299a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka OMX_CORE_INPUT_PORT_INDEX,NULL ); 3300a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka } 3301a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka } 3302a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka} 3303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 330561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 330661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SendCommandEvent 3307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 330861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 330961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Send the event to decoder pipe. This is needed to generate the callbacks 331061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan in decoder thread context. 3311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 331261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 331361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 3314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 331561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 331661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 3317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 331861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 33198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::post_event(unsigned long p1, 33208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long p2, 33218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long id) 3322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 33238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan bool bRet = false; 332461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3325f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* Just drop messages typically generated by hardware (w/o client request), 3326f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan * if we've reported an error to client. */ 3327f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (m_error_propogated) { 3328f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan switch (id) { 3329f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 3330f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 3331f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Dropping message %lx " 3332f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan "since client expected to be in error state", id); 3333f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return false; 3334f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan default: 3335f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* whatever */ 3336f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 3337f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 3338f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 333961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 334061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 334161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 334261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (id == m_fill_output_msg || 3343f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan id == OMX_COMPONENT_GENERATE_FBD || 3344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin id == OMX_COMPONENT_GENERATE_PORT_RECONFIG || 3345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin id == OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH) { 334661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.insert_entry(p1,p2,id); 334761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (id == OMX_COMPONENT_GENERATE_ETB || 334861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan id == OMX_COMPONENT_GENERATE_EBD || 3349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY || 3350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin id == OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH) { 335161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.insert_entry(p1,p2,id); 335261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 335361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cmd_q.insert_entry(p1,p2,id); 335461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 335561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 335661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 33578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this); 335861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_message(this, id); 335961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 336061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 336161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 336261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 3363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3365a268cdfcbfaec07af3e3b8df50a4027e55653a8aPraveen ChavanOMX_ERRORTYPE omx_vdec::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) 3366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 336761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 336861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!profileLevelType) 336961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 3370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 337161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nPortIndex == 0) { 337261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 337361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 337461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 3375a268cdfcbfaec07af3e3b8df50a4027e55653a8aPraveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel51; 337661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 337761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 337861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 3379a268cdfcbfaec07af3e3b8df50a4027e55653a8aPraveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel51; 338061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 2) { 338161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 3382a268cdfcbfaec07af3e3b8df50a4027e55653a8aPraveen Chavan profileLevelType->eLevel = OMX_VIDEO_AVCLevel51; 338361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 33848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 33858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)profileLevelType->nProfileIndex); 33868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = OMX_ErrorNoMore; 33878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 33888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 33898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 33908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan profileLevelType->eProfile = QOMX_VIDEO_MVCProfileStereoHigh; 33918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan profileLevelType->eLevel = QOMX_VIDEO_MVCLevel51; 33928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 33938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 33948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)profileLevelType->nProfileIndex); 339561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 339661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 33978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 3398f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (profileLevelType->nProfileIndex == 0) { 3399f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain; 3400f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan profileLevelType->eLevel = OMX_VIDEO_HEVCMainTierLevel51; 3401bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch } else if (profileLevelType->nProfileIndex == 1) { 3402bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain10; 3403bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch profileLevelType->eLevel = OMX_VIDEO_HEVCMainTierLevel51; 3404f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 34058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 34068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)profileLevelType->nProfileIndex); 34078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = OMX_ErrorNoMore; 3408f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 340961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) { 341061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 341161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline; 341261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_H263Level70; 341361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 34148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 34158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)profileLevelType->nProfileIndex); 341661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 341761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 341861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 341961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 342061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 342161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 342261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 342361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 342461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 342561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 34268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 34278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)profileLevelType->nProfileIndex); 342861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 342961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE) || 3431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) { 343261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 343361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 343461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (profileLevelType->nProfileIndex == 0) { 343561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple; 343661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 343761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (profileLevelType->nProfileIndex == 1) { 343861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain; 343961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 344061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 34418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 34428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)profileLevelType->nProfileIndex); 344361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 344461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 344561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 34468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore for codec: %s", drv_ctx.kind); 344761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 344861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 344961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 34508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %u", 34518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)profileLevelType->nPortIndex); 345261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 34536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 345461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 345861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 345961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetParameter 3460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 346161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 346261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Get Parameter method implementation 3463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 346461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 346561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 346761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 346861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Error None if successful. 3469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 347061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp, 347261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE paramIndex, 347361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_PTR paramData) 3474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 34758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 3476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 3477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 34788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter:"); 347961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 34808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Param in Invalid State"); 3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 348361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (paramData == NULL) { 34848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Get Param in Invalid paramData"); 3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 348761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)paramIndex) { 348861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPortDefinition: { 348916ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE); 349061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn = 349161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 34928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition"); 3493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin decide_dpb_buffer_mode(is_down_scalar_enabled); 349461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = update_portdef(portDefn); 349561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 349661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_port_def = *portDefn; 349761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 349861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 349961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoInit: { 350016ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 350161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *portParamType = 350261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 35038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit"); 350461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 350561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nVersion.nVersion = OMX_SPEC_VERSION; 350616ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan portParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE); 350761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nPorts = 2; 350861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portParamType->nStartPortNumber = 0; 350961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 351061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 351161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoPortFormat: { 351216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE); 351361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 351461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 35158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat"); 351661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 351761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nVersion.nVersion = OMX_SPEC_VERSION; 351816ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan portFmt->nSize = sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE); 351961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 352061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nPortIndex) { 352161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portFmt->nIndex) { 352261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eColorFormat = OMX_COLOR_FormatUnused; 352361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eCompressionFormat = eCompressionFormat; 352461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 352561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\ 35268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " NoMore compression formats"); 352761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 352861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 352961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (1 == portFmt->nPortIndex) { 353061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 3531f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 3532f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // Distinguish non-surface mode from normal playback use-case based on 3533f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // usage hinted via "OMX.google.android.index.useAndroidNativeBuffer2" 3534f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // For non-android, use the default list 3535f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // Also use default format-list if FLEXIBLE YUV is supported, 3536f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // as the client negotiates the standard color-format if it needs to 3537f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan bool useNonSurfaceMode = false; 3538f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#if defined(_ANDROID_) && !defined(FLEXYUV_SUPPORTED) 3539f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan useNonSurfaceMode = (m_enable_android_native_buffers == OMX_FALSE); 3540f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif 3541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (is_thulium_v1) { 3542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portFmt->eColorFormat = getPreferredColorFormatDefaultMode(portFmt->nIndex); 3543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 3544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portFmt->eColorFormat = useNonSurfaceMode ? 3545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin getPreferredColorFormatNonSurfaceMode(portFmt->nIndex) : 3546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin getPreferredColorFormatDefaultMode(portFmt->nIndex); 3547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 35488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 35498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (portFmt->eColorFormat == OMX_COLOR_FormatMax ) { 35508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = OMX_ErrorNoMore; 355161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\ 35528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " NoMore Color formats"); 355361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 35548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("returning color-format: 0x%x", portFmt->eColorFormat); 355561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 35568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: Bad port index %d", 355761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portFmt->nPortIndex); 355861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 355961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 356061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 356161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 356261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 356361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamAudioInit: { 356416ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 356561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *audioPortParamType = 356661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 35678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit"); 356861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 356916ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan audioPortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE); 357061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nPorts = 0; 357161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan audioPortParamType->nStartPortNumber = 0; 357261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 357361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 357461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 357561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamImageInit: { 357616ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 357761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PORT_PARAM_TYPE *imagePortParamType = 357861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PORT_PARAM_TYPE *) paramData; 35798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit"); 358061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 358116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan imagePortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE); 358261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nPorts = 0; 358361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan imagePortParamType->nStartPortNumber = 0; 358461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 358561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 358661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 358761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Component should support this port definition*/ 358861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamOtherInit: { 35898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x", 359061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 359161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedIndex; 359261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 359361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 359461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamStandardComponentRole: { 359516ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE); 359661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_COMPONENTROLETYPE *comp_role; 359761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 359861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->nVersion.nVersion = OMX_SPEC_VERSION; 359961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->nSize = sizeof(*comp_role); 360061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 36018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d", 360261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 360361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char*)comp_role->cRole,(const char*)m_cRole, 360461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_MAX_STRINGNAME_SIZE); 360561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 360661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 360761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Added for parameter test */ 360861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPriorityMgmt: { 360916ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE); 361061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PRIORITYMGMTTYPE *priorityMgmType = 361161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PRIORITYMGMTTYPE *) paramData; 36128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt"); 361361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION; 361416ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan priorityMgmType->nSize = sizeof(OMX_PRIORITYMGMTTYPE); 361561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 361661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 361761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 361861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Added for parameter test */ 361961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamCompBufferSupplier: { 362016ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE); 362161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = 362261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 36238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier"); 362461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 362516ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan bufferSupplierType->nSize = sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE); 362661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION; 362761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == bufferSupplierType->nPortIndex) 362861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 362961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (1 == bufferSupplierType->nPortIndex) 363061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 363161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 363261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 363361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 363461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 363561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 363661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 363761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoAvc: { 36388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x", 36398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan paramIndex); 36408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 36418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 36428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: { 36438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: QOMX_IndexParamVideoMvc %08x", 364461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 364561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 364661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 364761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoH263: { 36488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x", 364961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 365061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 365161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 365261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg4: { 36538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x", 365461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 365561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 365661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 365761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg2: { 36588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x", 365961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 366061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 366161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 366261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoProfileLevelQuerySupported: { 366316ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE); 36648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex); 366561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType = 366661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData; 3667a268cdfcbfaec07af3e3b8df50a4027e55653a8aPraveen Chavan eRet = get_supported_profile_level(profileLevelType); 366861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 366961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 367161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: { 367216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, GetAndroidNativeBufferUsageParams); 36738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage"); 367461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData; 367561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 367661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 3677f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (secure_mode && !secure_scaling_to_non_secure_opb) { 367861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED | 367961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan GRALLOC_USAGE_PRIVATE_UNCACHED); 368061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 3681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_UNCACHED; 368261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 368361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 36848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!"); 368561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 368661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 368761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 368861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 3689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 3690f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 3691f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef FLEXYUV_SUPPORTED 3692709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan case OMX_QcomIndexFlexibleYUVDescription: { 3693709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan DEBUG_PRINT_LOW("get_parameter: describeColorFormat"); 369416ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, DescribeColorFormatParams); 3695f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = describeColorFormat(paramData); 3696709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan break; 3697709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan } 3698f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif 3699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoProfileLevelCurrent: { 370016ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE); 3701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData; 3702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_control profile_control, level_control; 3703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (drv_ctx.decoder_format) { 3705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDEC_CODECTYPE_H264: 3706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin profile_control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE; 3707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin level_control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL; 3708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 3710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("get_param of OMX_IndexParamVideoProfileLevelCurrent only available for H264"); 3711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorNotImplemented; 3712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &profile_control)) { 3716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch ((enum v4l2_mpeg_video_h264_profile)profile_control.value) { 3717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE: 3718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE: 3719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eProfile = OMX_VIDEO_AVCProfileBaseline; 3720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN: 3722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eProfile = OMX_VIDEO_AVCProfileMain; 3723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED: 3725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eProfile = OMX_VIDEO_AVCProfileExtended; 3726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH: 3728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eProfile = OMX_VIDEO_AVCProfileHigh; 3729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10: 3731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eProfile = OMX_VIDEO_AVCProfileHigh10; 3732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422: 3734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eProfile = OMX_VIDEO_AVCProfileHigh422; 3735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE: 3737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA: 3738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA: 3739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA: 3740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA: 3741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE: 3742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH: 3743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA: 3744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH: 3745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH: 3746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH: 3747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedIndex; 3748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 3751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedIndex; 3752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &level_control)) { 3756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch ((enum v4l2_mpeg_video_h264_level)level_control.value) { 3757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_1_0: 3758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel1; 3759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_1B: 3761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel1b; 3762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_1_1: 3764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel11; 3765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_1_2: 3767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel12; 3768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_1_3: 3770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel13; 3771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_2_0: 3773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel2; 3774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_2_1: 3776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel21; 3777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_2_2: 3779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel22; 3780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_3_0: 3782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel3; 3783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_3_1: 3785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel31; 3786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_3_2: 3788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel32; 3789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_4_0: 3791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel4; 3792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_4_1: 3794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel41; 3795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_4_2: 3797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel42; 3798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_5_0: 3800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel5; 3801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_5_1: 3803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel51; 3804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_MPEG_VIDEO_H264_LEVEL_5_2: 3805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pParam->eLevel = OMX_VIDEO_AVCLevel52; 3806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 3809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedIndex; 3810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3813f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 3814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 381561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: { 38168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex); 381761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedIndex; 381861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 382061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 3821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 38228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)", 382361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_width, 382461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_height, 382561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.stride, 382661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.scan_lines); 3827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 382861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 3829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 3831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 3832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data) 3833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Inside use_android_native_buffer"); 3835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 3836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data; 3837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 383861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((params == NULL) || 383961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (params->nativeBuffer == NULL) || 384061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (params->nativeBuffer->handle == NULL) || 384161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !m_enable_android_native_buffers) 3842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 3843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_use_android_native_buffers = OMX_TRUE; 3844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev sp<android_native_buffer_t> nBuf = params->nativeBuffer; 3845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev private_handle_t *handle = (private_handle_t *)nBuf->handle; 384661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port 3847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buffer = NULL; 384861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 384961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = (OMX_U8*)mmap(0, handle->size, 3850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 385161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == MAP_FAILED) { 385261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 385361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 3854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer); 3857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } else { 3858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadParameter; 3859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 3860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 3861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 3862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 38638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 38648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::enable_smoothstreaming() { 38658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct v4l2_control control; 38668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct v4l2_format fmt; 38678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER; 38688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.value = 1; 38698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 38708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (rc < 0) { 38718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver."); 38728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorHardware; 38738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 38748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_smoothstreaming_mode = true; 38758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorNone; 38768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 38778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 3878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 387961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 388061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::Setparameter 3881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 388261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 388361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Set Parameter method implementation. 3884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 388561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 388661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 3887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 388861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 388961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 3890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 389161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 3892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, 389361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE paramIndex, 389461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR paramData) 3895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 3896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 38976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal int ret=0; 38986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct v4l2_format fmt; 3899f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef _ANDROID_ 3900f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan char property_value[PROPERTY_VALUE_MAX] = {0}; 3901f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif 390261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 39038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Param in Invalid State"); 3904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 3905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 390661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (paramData == NULL) { 39078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Param in Invalid paramData"); 390861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 390961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 391061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state != OMX_StateLoaded) && 391161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) && 391261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_out_bEnabled == OMX_TRUE) && 391361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) && 391461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_inp_bEnabled == OMX_TRUE)) { 39158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Param in Invalid State"); 3916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 3917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 391861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)paramIndex) { 391961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPortDefinition: { 392016ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE); 392161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 392261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 392361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has 392461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //been called. 39258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d", 392661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->format.video.nFrameHeight, 392761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->format.video.nFrameWidth); 3928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3929ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) { 3930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: Buffers requested exceeds max limit %d", 3931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->nBufferCountActual); 3932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 3933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 393561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_DirOutput == portDefn->eDir) { 39368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port"); 3937f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan bool port_format_changed = false; 393861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_display_id = portDefn->format.video.pNativeWindow; 393961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buffer_size; 39408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan /* update output port resolution with client supplied dimensions 39418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan in case scaling is enabled, else it follows input resolution set 39428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan */ 3943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin decide_dpb_buffer_mode(is_down_scalar_enabled); 39448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (is_down_scalar_enabled) { 39458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("SetParam OP: WxH(%u x %u)", 39468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->format.video.nFrameWidth, 39478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->format.video.nFrameHeight); 39488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (portDefn->format.video.nFrameHeight != 0x0 && 39498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan portDefn->format.video.nFrameWidth != 0x0) { 3950f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memset(&fmt, 0x0, sizeof(struct v4l2_format)); 3951f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 3952f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 3953f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 3954f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (ret) { 3955f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Get Resolution failed"); 3956f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = OMX_ErrorHardware; 3957f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 3958f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 3959f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if ((portDefn->format.video.nFrameHeight != (unsigned int)fmt.fmt.pix_mp.height) || 3960f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (portDefn->format.video.nFrameWidth != (unsigned int)fmt.fmt.pix_mp.width)) { 3961f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan port_format_changed = true; 3962f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 39638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan update_resolution(portDefn->format.video.nFrameWidth, 39648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan portDefn->format.video.nFrameHeight, 39658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan portDefn->format.video.nFrameWidth, 39668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan portDefn->format.video.nFrameHeight); 3967f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 3968f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* set crop info */ 3969f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan rectangle.nLeft = 0; 3970f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan rectangle.nTop = 0; 3971f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan rectangle.nWidth = portDefn->format.video.nFrameWidth; 3972f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan rectangle.nHeight = portDefn->format.video.nFrameHeight; 3973f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 39748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = is_video_session_supported(); 39758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (eRet) 39768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 3977f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memset(&fmt, 0x0, sizeof(struct v4l2_format)); 39788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 39798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 39808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 39818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 39828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d", 39838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan fmt.fmt.pix_mp.height, fmt.fmt.pix_mp.width); 39848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 39858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (ret) { 39868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Resolution failed"); 39878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 39888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else 39898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 39908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 3991f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 3992f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (eRet) { 3993f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 3994f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 3995f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 3996f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (secure_mode) { 3997f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan struct v4l2_control control; 3998f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE_SCALING_THRESHOLD; 3999f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) { 4000f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Failed getting secure scaling threshold : %d, id was : %x", errno, control.id); 4001f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = OMX_ErrorHardware; 4002f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 4003f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* This is a workaround for a bug in fw which uses stride 4004f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan * and slice instead of width and height to check against 4005f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan * the threshold. 4006f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan */ 4007f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_U32 stride, slice; 4008f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) { 4009f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, portDefn->format.video.nFrameWidth); 4010f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12, portDefn->format.video.nFrameHeight); 4011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) { 4012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameWidth); 4013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameHeight); 4014f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 4015f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan stride = portDefn->format.video.nFrameWidth; 4016f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan slice = portDefn->format.video.nFrameHeight; 4017f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4018f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 4019f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("Stride is %d, slice is %d, sxs is %d\n", stride, slice, stride * slice); 4020f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("Threshold value is %d\n", control.value); 4021f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 4022f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (stride * slice <= (OMX_U32)control.value) { 4023f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan secure_scaling_to_non_secure_opb = true; 4024f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Enabling secure scalar out of CPZ"); 4025f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_NON_SECURE_OUTPUT2; 4026f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan control.value = 1; 4027f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) { 4028f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Enabling non-secure output2 failed"); 4029f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = OMX_ErrorUnsupportedSetting; 4030f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4032f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4033f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4034f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4035f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 4036f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (eRet) { 4037f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 4038f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4039f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 4040fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) { 4041fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan DEBUG_PRINT_ERROR("Requested o/p buf count (%u) exceeds limit (%u)", 4042fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS); 4043fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan eRet = OMX_ErrorBadParameter; 4044fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan } else if (!client_buffers.get_buffer_req(buffer_size)) { 40458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error in getting buffer requirements"); 404661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 4047f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else if (!port_format_changed) { 4048fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan 4049ee06e61ff49357884de5c6714828c263966895eePraveen Chavan // Buffer count can change only when port is unallocated 4050ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (m_out_mem_ptr && 4051ee06e61ff49357884de5c6714828c263966895eePraveen Chavan (portDefn->nBufferCountActual != drv_ctx.op_buf.actualcount || 4052ee06e61ff49357884de5c6714828c263966895eePraveen Chavan portDefn->nBufferSize != drv_ctx.op_buf.buffer_size)) { 4053ee06e61ff49357884de5c6714828c263966895eePraveen Chavan 4054fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan DEBUG_PRINT_ERROR("Cannot change o/p buffer count since all buffers are not freed yet !"); 4055fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan eRet = OMX_ErrorInvalidState; 4056fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan break; 4057fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan } 4058fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan 405961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount && 406061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize >= drv_ctx.op_buf.buffer_size ) { 406161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual; 406261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size = portDefn->nBufferSize; 406361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.count = drv_ctx.op_buf.actualcount; 406461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = drv_ctx.extradata_info.count * 406561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.buffer_size; 406661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(&drv_ctx.op_buf); 406761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 406861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_port_def = *portDefn; 406961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 40708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%u: %u)", 4071f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan drv_ctx.op_buf.mincount, (unsigned int)drv_ctx.op_buf.buffer_size, 40728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize); 407361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 407461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 407561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 407661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (OMX_DirInput == portDefn->eDir) { 40778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port"); 407861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool port_format_changed = false; 407961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((portDefn->format.video.xFramerate >> 16) > 0 && 408061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) { 408161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Frame rate only should be set if this is a "known value" or to 408261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // activate ts prediction logic (arbitrary mode only) sending input 408361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // timestamps with max value (LLONG_MAX). 40848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %u", 40858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->format.video.xFramerate >> 16); 408661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator, 408761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator); 408861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!drv_ctx.frame_rate.fps_numerator) { 408961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 409061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = 30; 409161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 409261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.frame_rate.fps_denominator) 409361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = (int) 409461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 409561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = 1; 409661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 409761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator; 40988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)", 40998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator / 410061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)drv_ctx.frame_rate.fps_denominator); 41018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 41028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct v4l2_outputparm oparm; 41038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan /*XXX: we're providing timing info as seconds per frame rather than frames 41048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan * per second.*/ 41058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 41068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 41078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 41088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct v4l2_streamparm sparm; 41098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 41108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan sparm.parm.output = oparm; 41118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) { 41128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unable to convey fps info to driver, performance might be affected"); 41138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = OMX_ErrorHardware; 41148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 4115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_perf_control.request_cores(frm_int); 41178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 41188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 411961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.video_resolution.frame_height != 412061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameHeight || 412161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.video_resolution.frame_width != 412261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.nFrameWidth) { 41238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("SetParam IP: WxH(%u x %u)", 41248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->format.video.nFrameWidth, 41258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->format.video.nFrameHeight); 412661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan port_format_changed = true; 41278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 frameWidth = portDefn->format.video.nFrameWidth; 41288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 frameHeight = portDefn->format.video.nFrameHeight; 41298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (frameHeight != 0x0 && frameWidth != 0x0) { 41308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_smoothstreaming_mode && 41318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ((frameWidth * frameHeight) < 41328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (m_smoothstreaming_width * m_smoothstreaming_height))) { 41338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frameWidth = m_smoothstreaming_width; 41348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frameHeight = m_smoothstreaming_height; 41358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("NOTE: Setting resolution %u x %u " 41368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "for adaptive-playback/smooth-streaming", 41378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)frameWidth, (unsigned int)frameHeight); 41388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 41398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan update_resolution(frameWidth, frameHeight, 41408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frameWidth, frameHeight); 414161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = is_video_session_supported(); 414261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet) 414361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 4144f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memset(&fmt, 0x0, sizeof(struct v4l2_format)); 414561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 414661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 414761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 414861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 41498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width); 415061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 415161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 41528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Resolution failed"); 415361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 4154f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 4155f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!is_down_scalar_enabled) 4156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = get_buffer_req(&drv_ctx.op_buf); 4157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 415861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 415961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4160f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (m_custom_buffersize.input_buffersize 4161f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan && (portDefn->nBufferSize > m_custom_buffersize.input_buffersize)) { 4162f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("ERROR: Custom buffer size set by client: %d, trying to set: %d", 4163f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_custom_buffersize.input_buffersize, portDefn->nBufferSize); 4164f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = OMX_ErrorBadParameter; 4165f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 4166f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4167fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) { 4168fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan DEBUG_PRINT_ERROR("Requested i/p buf count (%u) exceeds limit (%u)", 4169fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS); 4170fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan eRet = OMX_ErrorBadParameter; 4171fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan break; 4172fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan } 4173ee06e61ff49357884de5c6714828c263966895eePraveen Chavan // Buffer count can change only when port is unallocated 4174ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (m_inp_mem_ptr && 4175ee06e61ff49357884de5c6714828c263966895eePraveen Chavan (portDefn->nBufferCountActual != drv_ctx.ip_buf.actualcount || 4176ee06e61ff49357884de5c6714828c263966895eePraveen Chavan portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size)) { 4177fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan DEBUG_PRINT_ERROR("Cannot change i/p buffer count since all buffers are not freed yet !"); 4178fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan eRet = OMX_ErrorInvalidState; 4179fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan break; 4180fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan } 4181fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan 418261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount 418361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) { 418461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan port_format_changed = true; 418561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf; 418661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual; 418761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) & 418861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (~(buffer_prop->alignment - 1)); 418961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(buffer_prop); 419061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 419161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (false == port_format_changed) { 41928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%u: %u)", 4193f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan drv_ctx.ip_buf.mincount, (unsigned int)drv_ctx.ip_buf.buffer_size, 41948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize); 419561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 419661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 419761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portDefn->eDir == OMX_DirMax) { 419861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d", 419961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->nPortIndex); 420061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 420161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 420261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 420361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 420461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoPortFormat: { 420516ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE); 420661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 420761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 420861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret=0; 420961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 42108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat 0x%x, port: %u", 42118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan portFmt->eColorFormat, (unsigned int)portFmt->nPortIndex); 421261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 4213f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memset(&fmt, 0x0, sizeof(struct v4l2_format)); 421461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (1 == portFmt->nPortIndex) { 421561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 421661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 421761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 421861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum vdec_output_fromat op_format; 42198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 42208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m || 42218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 42228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView || 42238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar || 4224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) { 422561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12; 4226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 4227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) { 4228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12_UBWC; 4229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else 423061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 423161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 4232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 4233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) { 4234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12_UBWC; 4235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 4236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12; 4237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 423961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 424061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.output_format = op_format; 424161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 424261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 42438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set output format failed"); 424461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 424561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 424661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 424761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 424861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 424961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 425061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 425161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.set_color_format(portFmt->eColorFormat)) { 42528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set color format failed"); 425361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 425461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 425561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 425661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 425761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 425861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 425961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 426061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexPortDefn: { 426116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PARAM_PORTDEFINITIONTYPE); 426261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt = 426361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData; 42648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %u", 42658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portFmt->nFramePackingFormat); 426661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 426761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Input port */ 426861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portFmt->nPortIndex == 0) { 4269ee06e61ff49357884de5c6714828c263966895eePraveen Chavan // arbitrary_bytes mode cannot be changed arbitrarily since this controls how: 4270ee06e61ff49357884de5c6714828c263966895eePraveen Chavan // - headers are allocated and 4271ee06e61ff49357884de5c6714828c263966895eePraveen Chavan // - headers-indices are derived 4272ee06e61ff49357884de5c6714828c263966895eePraveen Chavan // Avoid changing arbitrary_bytes when the port is already allocated 4273ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (m_inp_mem_ptr) { 4274ee06e61ff49357884de5c6714828c263966895eePraveen Chavan DEBUG_PRINT_ERROR("Cannot change arbitrary-bytes-mode since input port is not free!"); 4275ee06e61ff49357884de5c6714828c263966895eePraveen Chavan return OMX_ErrorUnsupportedSetting; 4276ee06e61ff49357884de5c6714828c263966895eePraveen Chavan } 427761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) { 4278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (secure_mode || m_input_pass_buffer_fd) { 427961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 4280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode"); 428161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 428261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 428361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = true; 428461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 428561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portFmt->nFramePackingFormat == 428661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_FramePacking_OnlyOneCompleteFrame) { 428761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan arbitrary_bytes = false; 4288f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef _ANDROID_ 4289f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0"); 4290f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (atoi(property_value)) { 4291f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("arbitrary_bytes enabled via property command"); 4292f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan arbitrary_bytes = true; 4293f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4294f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif 429561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 42968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %u", 42978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portFmt->nFramePackingFormat); 429861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 429961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 430061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 43018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port"); 430261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid && 430361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nMemRegion < OMX_QCOM_MemRegionMax) && 430461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) { 430561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_region_smi = OMX_TRUE; 430661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 43078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set"); 430861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem = OMX_TRUE; 430961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 431061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 431161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 431261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (is_thulium_v1 && !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", 4314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) { 4315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin arbitrary_bytes = true; 4316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Force arbitrary_bytes to true for h264"); 4317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 431861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 431961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 432061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamStandardComponentRole: { 432116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE); 432261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_COMPONENTROLETYPE *comp_role; 432361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 43248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s", 432561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan comp_role->cRole); 432661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 432761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_state == OMX_StateLoaded)&& 4328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !BITMASK_PRESENT(&m_flags, OMX_COMPONENT_IDLE_PENDING)) { 432961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Set Parameter called in valid state"); 433061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 433261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 433361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 433461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 4335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE)) { 4336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp((char*)comp_role->cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE)) { 4337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char*)m_cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE); 433861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 43408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 43418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 43428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 43438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!strncmp((char*)comp_role->cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 43448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan strlcpy((char*)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE); 43458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 43468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 4347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 434861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) { 4350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) { 4351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char*)m_cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE); 435261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 435461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 435561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) { 4357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp((const char*)comp_role->cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE)) { 4358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char*)m_cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE); 435961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 436161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 436261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) { 4364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) { 4365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char*)m_cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE); 436661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 436861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 436961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx", OMX_MAX_STRINGNAME_SIZE)) || 43718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311", OMX_MAX_STRINGNAME_SIZE)) || 43728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4", OMX_MAX_STRINGNAME_SIZE)) 437361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 4374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp((const char*)comp_role->cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE)) { 4375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char*)m_cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE); 437661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 437861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 437961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) || 4381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE)) 438261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 4383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp((const char*)comp_role->cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) { 4384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char*)m_cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE); 438561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 43868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 438761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet =OMX_ErrorUnsupportedSetting; 438861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) { 4390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE) || 4391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) { 4392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char*)m_cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE); 4393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 4394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 4395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 4396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { 4398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE) || 4399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) { 4400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char*)m_cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE); 440161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 44028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 440361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 440461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 44058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 44068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!strncmp((const char*)comp_role->cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 44078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan strlcpy((char*)m_cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE); 4408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 44098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 44108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 44118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 44128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 44138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind); 441461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 441561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 441661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 441761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 441861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 441961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamPriorityMgmt: { 442016ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE); 442161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state != OMX_StateLoaded) { 44228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 442361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 442461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 442561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData; 44268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %u", 44278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)priorityMgmtype->nGroupID); 442861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 44298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %u", 44308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)priorityMgmtype->nGroupPriority); 443161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 443261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_priority_mgm.nGroupID = priorityMgmtype->nGroupID; 443361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority; 443461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 443561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 443661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 443761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 443861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamCompBufferSupplier: { 443916ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE); 444061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 44418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d", 444261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferSupplierType->eBufferSupplier); 444361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1) 444461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier; 444561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 444661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 444761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 444861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 444961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 445061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 445161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 445261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 445361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoAvc: { 44548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d", 44558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan paramIndex); 44568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 44578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 44588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: { 44598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: QOMX_IndexParamVideoMvc %d", 446061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 446161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 4462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 446361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoH263: { 44648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d", 446561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 446661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 446761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 446861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg4: { 44698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d", 447061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 447161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 447261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 447361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoMpeg2: { 44748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d", 447561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan paramIndex); 447661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 447761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 447861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoDecoderPictureOrder: { 447916ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DECODER_PICTURE_ORDER); 448061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder = 448161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData; 448261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 448361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pic_order,rc=0; 44848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d", 448561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pictureOrder->eOutputPictureOrder); 448661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) { 448761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 448861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) { 448961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 449061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 449161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 449261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 449361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 449461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 449561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = pic_order; 449661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 449761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 44988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set picture order failed"); 449961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 450061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 450161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 45027ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan m_decode_order_mode = 45037ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER; 450461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 450561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 450661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamConcealMBMapExtraData: 450716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 4508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false, 4509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((QOMX_ENABLETYPE *)paramData)->bEnable); 4510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 45118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case OMX_QcomIndexParamFrameInfoExtraData: 451216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 4513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false, 4514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((QOMX_ENABLETYPE *)paramData)->bEnable); 4515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 45168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case OMX_ExtraDataFrameDimension: 451716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 45188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = enable_extradata(OMX_FRAMEDIMENSION_EXTRADATA, false, 45198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 45208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 452161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamInterlaceExtraData: 452216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 4523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false, 4524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((QOMX_ENABLETYPE *)paramData)->bEnable); 452561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 452661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamH264TimeInfo: 452716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 4528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false, 4529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((QOMX_ENABLETYPE *)paramData)->bEnable); 45308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 45318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case OMX_QcomIndexParamVideoFramePackingExtradata: 453216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 45338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = enable_extradata(OMX_FRAMEPACK_EXTRADATA, false, 45348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 45358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 45368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case OMX_QcomIndexParamVideoQPExtraData: 453716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 45388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = enable_extradata(OMX_QP_EXTRADATA, false, 45398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 45408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 45418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case OMX_QcomIndexParamVideoInputBitsInfoExtraData: 454216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 45438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = enable_extradata(OMX_BITSINFO_EXTRADATA, false, 45448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 45458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 45468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case OMX_QcomIndexEnableExtnUserData: 454716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 45488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = enable_extradata(OMX_EXTNUSER_EXTRADATA, false, 45498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 4550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QTIIndexParamVQZipSEIExtraData: 455216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 4553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false, 4554f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ((QOMX_ENABLETYPE *)paramData)->bEnable); 4555f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 455661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoDivx: { 455761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData; 455861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 455961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 456061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexPlatformPvt: { 456116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PLATFORMPRIVATE_EXTN); 45628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port"); 456361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData; 456461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 456561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type); 456661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 456761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 456861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_pvt_entry_pmem = OMX_TRUE; 456961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 45708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set"); 457161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_use_output_pmem = OMX_TRUE; 457261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 457361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 457461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 457561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 457661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 457761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamVideoSyncFrameDecodingMode: { 457861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode"); 457961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode"); 458061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 458161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 458261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.idr_only_decoding = 1; 458361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 458461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 458561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 458661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 45878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Set picture order failed"); 458861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 458961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 459061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE; 459161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE; 459261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 459361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 45948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Sync frame setting failed"); 459561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 459661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 459761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Setting sync frame decoding on driver might change buffer 459861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * requirements so update them here*/ 459961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (get_buffer_req(&drv_ctx.ip_buf)) { 46008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer i/p requirements"); 460161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 460261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 460361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (get_buffer_req(&drv_ctx.op_buf)) { 46048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer o/p requirements"); 460561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 460661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 460761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 460861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 460961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 461061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 461161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamIndexExtraDataType: { 461216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXEXTRADATATYPE); 4613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData; 4614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) && 4615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (extradataIndexType->bEnabled == OMX_TRUE) && 4616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (extradataIndexType->nPortIndex == 1)) { 46178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming"); 4618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled); 461961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 4620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 462361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamEnableSmoothStreaming: { 462461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef SMOOTH_STREAMING_DISABLED 46258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = enable_smoothstreaming(); 462661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else 462761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 462861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 462961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 463061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 4631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 463261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Need to allow following two set_parameters even in Idle 463361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * state. This is ANDROID architecture which is not in sync 463461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * with openmax standard. */ 463561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: { 463616ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, EnableAndroidNativeBuffersParams); 463761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData; 4638ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (enableNativeBuffers->nPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) { 4639ee06e61ff49357884de5c6714828c263966895eePraveen Chavan DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers allowed only on output port!"); 4640ee06e61ff49357884de5c6714828c263966895eePraveen Chavan eRet = OMX_ErrorUnsupportedSetting; 4641ee06e61ff49357884de5c6714828c263966895eePraveen Chavan break; 4642ee06e61ff49357884de5c6714828c263966895eePraveen Chavan } else if (m_out_mem_ptr) { 4643ee06e61ff49357884de5c6714828c263966895eePraveen Chavan DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers is not allowed since Output port is not free !"); 4644ee06e61ff49357884de5c6714828c263966895eePraveen Chavan eRet = OMX_ErrorInvalidState; 4645ee06e61ff49357884de5c6714828c263966895eePraveen Chavan break; 4646ee06e61ff49357884de5c6714828c263966895eePraveen Chavan } 464761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enableNativeBuffers) { 464861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_enable_android_native_buffers = enableNativeBuffers->enable; 464961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4650f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#if !defined(FLEXYUV_SUPPORTED) 4651f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (m_enable_android_native_buffers) { 4652f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // Use the most-preferred-native-color-format as surface-mode is hinted here 4653f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if(!client_buffers.set_color_format(getPreferredColorFormatDefaultMode(0))) { 4654f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Failed to set native color format!"); 4655f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = OMX_ErrorUnsupportedSetting; 4656f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4657f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4658f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif 465961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 466061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 466161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: { 466216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, UseAndroidNativeBufferParams); 466361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = use_android_native_buffer(hComp, paramData); 466461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 466561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 46664173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan case OMX_GoogleAndroidIndexAllocateNativeHandle: { 4667e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick 46684173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan AllocateNativeHandleParams* allocateNativeHandleParams = (AllocateNativeHandleParams *) paramData; 4669e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick VALIDATE_OMX_PARAM_DATA(paramData, AllocateNativeHandleParams); 4670e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick 4671e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick if (allocateNativeHandleParams->nPortIndex != OMX_CORE_INPUT_PORT_INDEX) { 4672e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle allowed only on input port!"); 4673e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick eRet = OMX_ErrorUnsupportedSetting; 4674e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick break; 4675e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick } else if (m_inp_mem_ptr) { 4676e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle is not allowed since Input port is not free !"); 4677e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick eRet = OMX_ErrorInvalidState; 4678e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick break; 4679e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick } 4680e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick 46814173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan if (allocateNativeHandleParams != NULL) { 46824173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan allocate_native_handle = allocateNativeHandleParams->enable; 46834173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan } 46844173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan } 46854173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan break; 4686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 468761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexParamEnableTimeStampReorder: { 468816ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXTIMESTAMPREORDER); 468961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData; 469061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) { 469161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (reorder->bEnable == OMX_TRUE) { 469261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int =0; 469361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(true); 469461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 469561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 469661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 469761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.set_timestamp_reorder_mode(false); 469861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (reorder->bEnable == OMX_TRUE) { 469961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 470061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 470161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 470261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 470361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 470461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexParamVideoProfileLevelCurrent: { 470516ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE); 470661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = 470761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData; 470861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pParam) { 470961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_profile_lvl.eProfile = pParam->eProfile; 471061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_profile_lvl.eLevel = pParam->eLevel; 471161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 471261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 471361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 471461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 471524bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon case OMX_QcomIndexParamVideoMetaBufferMode: 471624bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon { 471716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, StoreMetaDataInBuffersParams); 471824bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon StoreMetaDataInBuffersParams *metabuffer = 471924bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon (StoreMetaDataInBuffersParams *)paramData; 472024bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon if (!metabuffer) { 472124bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon DEBUG_PRINT_ERROR("Invalid param: %p", metabuffer); 472224bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon eRet = OMX_ErrorBadParameter; 472324bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon break; 472424bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon } 47258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_disable_dynamic_buf_mode) { 4726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Dynamic buffer mode is disabled"); 47278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = OMX_ErrorUnsupportedSetting; 47288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 47298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 47308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (metabuffer->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 4731ee06e61ff49357884de5c6714828c263966895eePraveen Chavan 4732ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (m_out_mem_ptr) { 4733ee06e61ff49357884de5c6714828c263966895eePraveen Chavan DEBUG_PRINT_ERROR("Enable/Disable dynamic-buffer-mode is not allowed since Output port is not free !"); 4734ee06e61ff49357884de5c6714828c263966895eePraveen Chavan eRet = OMX_ErrorInvalidState; 4735ee06e61ff49357884de5c6714828c263966895eePraveen Chavan break; 4736ee06e61ff49357884de5c6714828c263966895eePraveen Chavan } 473724bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon //set property dynamic buffer mode to driver. 473824bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon struct v4l2_control control; 473924bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon struct v4l2_format fmt; 474024bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon control.id = V4L2_CID_MPEG_VIDC_VIDEO_ALLOC_MODE_OUTPUT; 47418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (metabuffer->bStoreMetaData == true) { 4742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.value = V4L2_MPEG_VIDC_VIDEO_DYNAMIC; 47438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 47448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_STATIC; 47458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 474624bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 47478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!rc) { 47488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("%s buffer mode", 47498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (metabuffer->bStoreMetaData == true)? "Enabled dynamic" : "Disabled dynamic"); 4750073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava } else { 47518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to %s buffer mode", 47528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (metabuffer->bStoreMetaData == true)? "enable dynamic" : "disable dynamic"); 475324bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon } 4754c8e6a3cc21c2fa657b143f4e06734eebab7e00b8Santhosh Behara dynamic_buf_mode = metabuffer->bStoreMetaData; 475524bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon } else { 47568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR( 47578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "OMX_QcomIndexParamVideoMetaBufferMode not supported for port: %u", 47588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)metabuffer->nPortIndex); 475924bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon eRet = OMX_ErrorUnsupportedSetting; 476024bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon } 476124bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon break; 476224bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon } 47638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case OMX_QcomIndexParamVideoDownScalar: 47648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan { 476516ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXDOWNSCALAR); 47668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan QOMX_INDEXDOWNSCALAR* pParam = (QOMX_INDEXDOWNSCALAR*)paramData; 47678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct v4l2_control control; 47688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan int rc; 4769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoDownScalar %d\n", pParam->bEnable); 4770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pParam && pParam->bEnable) { 4772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = enable_downscalar(); 4773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc < 0) { 4774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__); 4775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorUnsupportedSetting; 47768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 4777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_force_down_scalar = pParam->bEnable; 4778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 4779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = disable_downscalar(); 4780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc < 0) { 4781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__); 4782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorUnsupportedSetting; 4783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_force_down_scalar = pParam->bEnable; 47858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 47868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 47878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 47888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef ADAPTIVE_PLAYBACK_SUPPORTED 47898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case OMX_QcomIndexParamVideoAdaptivePlaybackMode: 47908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan { 479116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, PrepareForAdaptivePlaybackParams); 47928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_GoogleAndroidIndexPrepareForAdaptivePlayback"); 47938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan PrepareForAdaptivePlaybackParams* pParams = 47948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (PrepareForAdaptivePlaybackParams *) paramData; 47958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (pParams->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 47968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!pParams->bEnable) { 47978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorNone; 47988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 47998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (pParams->nMaxFrameWidth > maxSmoothStreamingWidth 48008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan || pParams->nMaxFrameHeight > maxSmoothStreamingHeight) { 48018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR( 48028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "Adaptive playback request exceeds max supported resolution : [%u x %u] vs [%u x %u]", 48038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)pParams->nMaxFrameWidth, (unsigned int)pParams->nMaxFrameHeight, 48048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)maxSmoothStreamingWidth, (unsigned int)maxSmoothStreamingHeight); 48058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = OMX_ErrorBadParameter; 48068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 4807f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = enable_adaptive_playback(pParams->nMaxFrameWidth, pParams->nMaxFrameHeight); 4808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 48098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 48108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR( 48118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "Prepare for adaptive playback supported only on output port"); 48128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = OMX_ErrorBadParameter; 48138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 48148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 48158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 48168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 4817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QTIIndexParamVideoPreferAdaptivePlayback: 4818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 481916ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 4820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoPreferAdaptivePlayback"); 4821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_disable_dynamic_buf_mode = ((QOMX_ENABLETYPE *)paramData)->bEnable; 4822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_disable_dynamic_buf_mode) { 4823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Prefer Adaptive Playback is set"); 4824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 48278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif 4828f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan case OMX_QcomIndexParamVideoCustomBufferSize: 4829f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan { 483016ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CUSTOM_BUFFERSIZE); 4831f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoCustomBufferSize"); 4832f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan QOMX_VIDEO_CUSTOM_BUFFERSIZE* pParam = (QOMX_VIDEO_CUSTOM_BUFFERSIZE*)paramData; 4833f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (pParam->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) { 4834f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan struct v4l2_control control; 4835f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_BUFFER_SIZE_LIMIT; 4836f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan control.value = pParam->nBufferSize; 4837f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 4838f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Failed to set input buffer size"); 4839f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = OMX_ErrorUnsupportedSetting; 4840f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 4841f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = get_buffer_req(&drv_ctx.ip_buf); 4842f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (eRet == OMX_ErrorNone) { 4843f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_custom_buffersize.input_buffersize = drv_ctx.ip_buf.buffer_size; 4844f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Successfully set custom input buffer size = %d", 4845f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_custom_buffersize.input_buffersize); 4846f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 4847f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Failed to get buffer requirement"); 4848f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4849f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4850f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 4851f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("ERROR: Custom buffer size in not supported on output port"); 4852f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = OMX_ErrorBadParameter; 4853f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4854f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 4855f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 4856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QTIIndexParamVQZIPSEIType: 4857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 485816ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE); 4859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVQZIPSEIType"); 4860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *pParam = 4861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *)paramData; 4862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Enable VQZIP SEI: %d", pParam->bEnable); 4863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false, 4864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((QOMX_ENABLETYPE *)paramData)->bEnable); 4865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (eRet != OMX_ErrorNone) { 4866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: Failed to set SEI Extradata"); 4867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 4868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA; 4869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 4870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = enable_extradata(OMX_QP_EXTRADATA, false, 4871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((QOMX_ENABLETYPE *)paramData)->bEnable); 4872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (eRet != OMX_ErrorNone) { 4873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: Failed to set QP Extradata"); 4874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 4875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA; 4876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extradata = client_extradata & ~OMX_QP_EXTRADATA; 4877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QTIIndexParamPassInputBufferFd: 4883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 488416ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 4885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (arbitrary_bytes) { 4886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("OMX_QTIIndexParamPassInputBufferFd not supported in arbitrary buffer mode"); 4887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 4888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_input_pass_buffer_fd = ((QOMX_ENABLETYPE *)paramData)->bEnable; 4892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_input_pass_buffer_fd) 4893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Enable passing input buffer FD"); 4894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QTIIndexParamForceCompressedForDPB: 4897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 489816ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE); 4899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceCompressedForDPB"); 4900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *pParam = 4901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *)paramData; 4902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_disable_ubwc_mode) { 4903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("OMX_QTIIndexParamForceCompressedForDPB not supported when ubwc disabled"); 4904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 4905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!paramData) { 4908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceCompressedForDPB paramData NULL"); 4909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 4910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_force_compressed_for_dpb = pParam->bEnable; 4914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QTIIndexParamForceUnCompressedForOPB: 4917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 491816ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE); 4919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB"); 4920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *pParam = 4921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *)paramData; 4922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!paramData) { 4923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB paramData is NULL"); 4924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 4925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_disable_ubwc_mode = pParam->bEnable; 4928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: UBWC %s for OPB", pParam->bEnable ? "disabled" : "enabled"); 4929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 493361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: { 49348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex); 493561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorUnsupportedIndex; 493661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 49388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (eRet != OMX_ErrorNone) 49398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("set_parameter: Error: 0x%x, setting param 0x%x", eRet, paramIndex); 494061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 4941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 4942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 4943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 494461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 494561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetConfig 4946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 494761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 494861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Get Config Method implementation. 4949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 495061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 495161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 4952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 495361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 495461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 4955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 495661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 4957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp, 495861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE configIndex, 495961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_PTR configData) 4960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 49618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 496261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 4963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 496461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 49658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Config in Invalid State"); 496661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 496761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 4968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 496961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)configIndex) { 497061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexConfigInterlaced: { 497116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_CONFIG_INTERLACETYPE); 497261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_CONFIG_INTERLACETYPE *configFmt = 497361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_CONFIG_INTERLACETYPE *) configData; 497461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configFmt->nPortIndex == 1) { 497561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (configFmt->nIndex == 0) { 497661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive; 497761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configFmt->nIndex == 1) { 497861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = 497961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 498061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (configFmt->nIndex == 2) { 498161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan configFmt->eInterlaceType = 498261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 498361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 498461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:" 49858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " NoMore Interlaced formats"); 498661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 498761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 498861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 498961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 49908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port", 499161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)configFmt->nPortIndex); 499261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 499361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 499461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 499561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 499661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexQueryNumberOfVideoDecInstance: { 499716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_QUERY_DECODER_INSTANCES); 499861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances = 499961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData; 500061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan decoderinstances->nNumOfInstances = 16; 500161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 500261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 500361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 500461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_QcomIndexConfigVideoFramePackingArrangement: { 500561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) { 500616ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_FRAME_PACK_ARRANGEMENT); 500761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt = 500861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData; 50098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan memcpy(configFmt, &m_frame_pack_arrangement, 50108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT)); 501161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 501261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs"); 501361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 501461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 501561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 501661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_IndexConfigCommonOutputCrop: { 501716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_RECTTYPE); 501861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData; 501961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE)); 5020f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("get_config: crop info: L: %u, T: %u, R: %u, B: %u", 5021f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan rectangle.nLeft, rectangle.nTop, 5022f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan rectangle.nWidth, rectangle.nHeight); 5023f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 5024f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 5025f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan case OMX_QcomIndexConfigPerfLevel: { 502616ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL); 5027f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan struct v4l2_control control; 5028f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf = 5029f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData; 5030f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 5031f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL; 5032f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) { 5033f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Failed getting performance level: %d", errno); 5034f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = OMX_ErrorHardware; 5035f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 5036f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 5037f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (eRet == OMX_ErrorNone) { 5038f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan switch (control.value) { 5039f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan case V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO: 5040f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan perf->ePerfLevel = OMX_QCOM_PerfLevelTurbo; 5041f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 5042f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan default: 5043f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Unknown perf level %d, reporting Nominal instead", control.value); 5044f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* Fall through */ 5045f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan case V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL: 5046f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan perf->ePerfLevel = OMX_QCOM_PerfLevelNominal; 5047f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 5048f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 5049f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 5050f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 5051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexConfigH264EntropyCodingCabac: { 505416ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_H264ENTROPYCODINGTYPE); 5055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_VIDEO_H264ENTROPYCODINGTYPE *coding = (QOMX_VIDEO_H264ENTROPYCODINGTYPE *)configData; 5056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_control control; 5057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.decoder_format != VDEC_CODECTYPE_H264) { 5059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("get_config of OMX_QcomIndexConfigH264EntropyCodingCabac only available for H264"); 5060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorNotImplemented; 5061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE; 5065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control)) { 5066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin coding->bCabac = (OMX_BOOL) 5067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (control.value == V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC); 5068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* We can't query driver at the moment for the cabac mode, so 5069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * just use 0xff...f as a place holder for future improvement */ 5070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin coding->nCabacInitIdc = ~0; 5071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 5072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedIndex; 5073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5077ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case OMX_QTIIndexConfigDescribeColorAspects: 5078ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan { 5079c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams); 5080ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData; 5081c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan 5082c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan print_debug_color_aspects(&(m_client_color_space.sAspects), "GetConfig Client"); 5083c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan print_debug_color_aspects(&(m_internal_color_space.sAspects), "GetConfig Internal"); 5084c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan 5085c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan if (params->bRequestingDataSpace) { 5086c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan DEBUG_PRINT_ERROR("Does not handle dataspace request"); 5087c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan return OMX_ErrorUnsupportedSetting; 5088c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan } 5089c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan if (m_internal_color_space.bDataSpaceChanged == OMX_TRUE) { 5090c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan DEBUG_PRINT_LOW("Updating Client's color aspects with internal"); 5091c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan memcpy(&(m_client_color_space.sAspects), 5092c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan &(m_internal_color_space.sAspects), sizeof(ColorAspects)); 5093c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan m_internal_color_space.bDataSpaceChanged = OMX_FALSE; 5094c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan } 5095c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan memcpy(&(params->sAspects), &(m_client_color_space.sAspects), sizeof(ColorAspects)); 5096c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan 5097ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 5098ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 50997ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan case OMX_IndexConfigAndroidVendorExtension: 51007ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan { 51017ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE); 51027ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan 51037ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext = 51047ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan reinterpret_cast<OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *>(configData); 51057ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan VALIDATE_OMX_VENDOR_EXTENSION_PARAM_DATA(ext); 51067ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan return get_vendor_extension_config(ext); 51077ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan } 51087ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan default: 51097ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan { 51107ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex); 51117ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan eRet = OMX_ErrorBadParameter; 51127ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan } 5113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 511661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 5117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 512061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 512161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SetConfig 5122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 512361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 512461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Set Config method implementation 5125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 512661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 512761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 512961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 513061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if successful. 513161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp, 513361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_INDEXTYPE configIndex, 513461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR configData) 5135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 51368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 513761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 51388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Config in Invalid State"); 513961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 5140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 514161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 514261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 514361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VIDEO_CONFIG_NALSIZE *pNal; 514461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 51458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set Config Called"); 514661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 5147ff8f9f29b46df8de6dba9bda31eab4beb67146b8Praveen Chavan if (configIndex == OMX_IndexConfigVideoNalSize) { 514861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control temp; 514961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT; 515061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 515116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_NALSIZE); 515261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData); 515361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (pNal->nNaluBytes) { 515461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case 0: 515561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES; 515661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 515761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case 2: 515861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_TWO_BYTE_LENGTH; 515961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 516061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case 4: 516161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH; 516261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 516361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 516461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorUnsupportedSetting; 5165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 516661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 516761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes) { 516861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* In arbitrary bytes mode, the assembler strips out nal size and replaces 516961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * with start code, so only need to notify driver in frame by frame mode */ 517061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &temp)) { 517161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT"); 517261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 517361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 517461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 517561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 517661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_length = pNal->nNaluBytes; 517761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.init_nal_length(nal_length); 517861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 51798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d", nal_length); 518061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 51818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if ((int)configIndex == (int)OMX_IndexVendorVideoFrameRate) { 518261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData; 51838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Index OMX_IndexVendorVideoFrameRate %u", (unsigned int)config->nFps); 518461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 518561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) { 518661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (config->bEnabled) { 518761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((config->nFps >> 16) > 0) { 51888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %u", 51898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)config->nFps >> 16); 519061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator, 519161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator); 519261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 519361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!drv_ctx.frame_rate.fps_numerator) { 519461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 519561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = 30; 519661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 519761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 519861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.frame_rate.fps_denominator) { 519961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = (int) 520061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 520161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 520261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 520361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = 1; 520461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 520561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator; 520661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 520761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_outputparm oparm; 520861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*XXX: we're providing timing info as seconds per frame rather than frames 520961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * per second.*/ 521061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 521161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 521261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 521361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_streamparm sparm; 521461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 521561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sparm.parm.output = oparm; 521661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) { 521761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \ 521861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan performance might be affected"); 521961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = OMX_ErrorHardware; 522061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 522161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_set_fps = true; 522261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 522361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Frame rate not supported."); 522461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = OMX_ErrorUnsupportedSetting; 522561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 522661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 522761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate"); 522861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_set_fps = false; 522961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 523061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 523161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d", 523261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)config->nPortIndex); 523361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = OMX_ErrorBadPortIndex; 5234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 523561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 523661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 5237f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else if ((int)configIndex == (int)OMX_QcomIndexConfigPerfLevel) { 5238f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf = 5239f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData; 5240f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan struct v4l2_control control; 5241f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 5242f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("Set perf level: %d", perf->ePerfLevel); 5243f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 5244f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL; 5245f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 5246f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan switch (perf->ePerfLevel) { 5247f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan case OMX_QCOM_PerfLevelNominal: 5248f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL; 5249f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 5250f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan case OMX_QCOM_PerfLevelTurbo: 5251f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO; 5252f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 5253f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan default: 5254f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ret = OMX_ErrorUnsupportedSetting; 5255f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 5256f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 5257f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 5258f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (ret == OMX_ErrorNone) { 5259f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ? 5260f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_ErrorUnsupportedSetting : OMX_ErrorNone; 5261f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 5262f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 5263f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return ret; 5264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if ((int)configIndex == (int)OMX_QcomIndexConfigPictureTypeDecode) { 5265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *config = 5266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *)configData; 5267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_control control; 5268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Set picture type decode: %d", config->eDecodeType); 5269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.id = V4L2_CID_MPEG_VIDC_VIDEO_PICTYPE_DEC_MODE; 5270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (config->eDecodeType) { 5272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QCOM_PictypeDecode_I: 5273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_ON; 5274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QCOM_PictypeDecode_IPB: 5276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 5277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_OFF; 5278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ? 5282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorUnsupportedSetting : OMX_ErrorNone; 5283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret) 5284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to set picture type decode"); 5285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return ret; 5287eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan } else if ((int)configIndex == (int)OMX_IndexConfigPriority) { 5288eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan OMX_PARAM_U32TYPE *priority = (OMX_PARAM_U32TYPE *)configData; 5289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Set_config: priority %d",priority->nU32); 5290eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan 5291eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan struct v4l2_control control; 5292eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan 5293eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY; 5294eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan if (priority->nU32 == 0) 5295eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE; 5296eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan else 5297eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE; 5298eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan 5299eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 5300eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan DEBUG_PRINT_ERROR("Failed to set Priority"); 5301eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan ret = OMX_ErrorUnsupportedSetting; 5302eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan } 5303eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan return ret; 5304dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan } else if ((int)configIndex == (int)OMX_IndexConfigOperatingRate) { 5305dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan OMX_PARAM_U32TYPE *rate = (OMX_PARAM_U32TYPE *)configData; 5306dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan DEBUG_PRINT_LOW("Set_config: operating-rate %u fps", rate->nU32 >> 16); 5307dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan 5308dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan struct v4l2_control control; 5309dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan 5310dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE; 5311dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan control.value = rate->nU32; 5312dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan 5313dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 5314dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan ret = errno == -EBUSY ? OMX_ErrorInsufficientResources : 5315dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan OMX_ErrorUnsupportedSetting; 5316dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan DEBUG_PRINT_ERROR("Failed to set operating rate %u fps (%s)", 5317dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan rate->nU32 >> 16, errno == -EBUSY ? "HW Overload" : strerror(errno)); 5318dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan } 5319dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan return ret; 5320ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 5321ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeColorAspects) { 5322ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams); 5323ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData; 5324c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan if (!DEFAULT_EXTRADATA & OMX_DISPLAY_INFO_EXTRADATA) { 5325c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan enable_extradata(OMX_DISPLAY_INFO_EXTRADATA, true, true); 5326c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan } 5327ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 5328c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan print_debug_color_aspects(&(params->sAspects), "Set Config"); 5329ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan memcpy(&m_client_color_space, params, sizeof(DescribeColorAspectsParams)); 5330ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan return ret; 53317ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan } else if ((int)configIndex == (int)OMX_IndexConfigAndroidVendorExtension) { 53327ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE); 53337ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan 53347ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext = 53357ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan reinterpret_cast<OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *>(configData); 53367ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan VALIDATE_OMX_VENDOR_EXTENSION_PARAM_DATA(ext); 53377ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan 53387ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan return set_vendor_extension_config(ext); 5339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 534161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 5342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5344c9770704a9bb7c26205cf0e5bca05d4397aab1c3Praveen Chavan#define extn_equals(param, extn) (!strcmp(param, extn)) 53458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 5346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 534761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 534861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetExtensionIndex 5349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 535061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 535161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX GetExtensionIndex method implementaion. <TBD> 5352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 535361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 535461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 535661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 535761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 5358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 535961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp, 536161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_STRING paramName, 536261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_INDEXTYPE* indexType) 5363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 53648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 536561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 53668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get Extension Index in Invalid State"); 5367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 53688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extn_equals(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode")) { 5369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode; 53708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extn_equals(paramName, "OMX.QCOM.index.param.IndexExtraData")) { 5371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType; 53728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_FRAMEPACKING_EXTRADATA)) { 53738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoFramePackingExtradata; 53748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extn_equals(paramName, OMX_QCOM_INDEX_CONFIG_VIDEO_FRAMEPACKING_INFO)) { 53758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement; 53768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_QP_EXTRADATA)) { 53778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPExtraData; 53788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_INPUTBITSINFO_EXTRADATA)) { 53798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoInputBitsInfoExtraData; 53808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_EXTNUSER_EXTRADATA)) { 53818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan *indexType = (OMX_INDEXTYPE)OMX_QcomIndexEnableExtnUserData; 5382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 53848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan else if (extn_equals(paramName, "OMX.google.android.index.enableAndroidNativeBuffers")) { 5385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 53868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer2")) { 5387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 53888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer")) { 53898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extension: %s is supported", paramName); 5390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 53918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extn_equals(paramName, "OMX.google.android.index.getAndroidNativeBufferUsage")) { 5392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 53934173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan } else if (extn_equals(paramName, "OMX.google.android.index.allocateNativeHandle")) { 53944173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexAllocateNativeHandle; 5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 53978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan else if (extn_equals(paramName, "OMX.google.android.index.storeMetaDataInBuffers")) { 539824bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoMetaBufferMode; 539924bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon } 5400f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef ADAPTIVE_PLAYBACK_SUPPORTED 54018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan else if (extn_equals(paramName, "OMX.google.android.index.prepareForAdaptivePlayback")) { 54028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoAdaptivePlaybackMode; 5403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_PREFER_ADAPTIVE_PLAYBACK)) { 5404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoPreferAdaptivePlayback; 54058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 54068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif 5407f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef FLEXYUV_SUPPORTED 5408709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan else if (extn_equals(paramName,"OMX.google.android.index.describeColorFormat")) { 5409709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan *indexType = (OMX_INDEXTYPE)OMX_QcomIndexFlexibleYUVDescription; 5410709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan } 5411f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif 5412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (extn_equals(paramName, "OMX.QCOM.index.param.video.PassInputBufferFd")) { 5413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamPassInputBufferFd; 5414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceCompressedForDPB")) { 5415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceCompressedForDPB; 5416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceUnCompressedForOPB")) { 5417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceUnCompressedForOPB; 5418ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } else if (extn_equals(paramName, "OMX.google.android.index.describeColorAspects")) { 5419ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeColorAspects; 5420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 54218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName); 5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNotImplemented; 5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 542861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 542961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::GetState 5430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 543161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 543261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns the state information back to the caller.<TBD> 5433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 543461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 543561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 543761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 543861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Error None if everything is successful. 543961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_state(OMX_IN OMX_HANDLETYPE hComp, 544161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STATETYPE* state) 5442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 54438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 544461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *state = m_state; 54458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("get_state: Returning the state %d",*state); 544661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 545061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 545161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentTunnelRequest 5452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 545361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 545461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Component Tunnel Request method implementation. <TBD> 5455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 545661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 545761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 545961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 546061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 5461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 546261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 54638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp, 546461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 546561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE peerComponent, 546661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 peerPort, 546761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup) 5468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 54698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 54708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) port; 54718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) peerComponent; 54728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) peerPort; 54738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) tunnelSetup; 54748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented"); 547561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 5476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 547961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 548061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseOutputBuffer 5481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 548261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 548361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper function for Use buffer in the input pin 5484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 548561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 548661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 5487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 548861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 548961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 5490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 549161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 54926eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_extradata() 54936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 54946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 549561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.buffer_size) { 549661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) { 549761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 549861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 549961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 550061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 550161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095); 550261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory( 550361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size, 4096, 550461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.extradata_info.ion.ion_alloc_data, 550561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.extradata_info.ion.fd_ion_data, 0); 550661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.ion.ion_device_fd < 0) { 55078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to alloc extradata memory"); 550861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 550961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 551061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.uaddr = (char *)mmap(NULL, 551161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.size, 551261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, 551361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.ion.fd_ion_data.fd , 0); 551461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.uaddr == MAP_FAILED) { 55158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to map extradata memory"); 551661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 551761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 551861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 551961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 552061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 55216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 55228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!m_other_extradata) { 55238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_other_extradata = (OMX_OTHER_EXTRADATATYPE *)malloc(drv_ctx.extradata_info.buffer_size); 55248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!m_other_extradata) { 55258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to alloc memory\n"); 55268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorInsufficientResources; 55278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 55288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 552961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 55306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 55316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 553261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_extradata() 553361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 55346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 553561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.extradata_info.uaddr) { 553661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 553761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 553861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.extradata_info.ion); 553961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 554061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info)); 55416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 55428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_other_extradata) { 55438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan free(m_other_extradata); 55448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_other_extradata = NULL; 55458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 55466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 55476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 55486eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::use_output_buffer( 554961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 555061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 555161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 555261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 555361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 555461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 5555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 555661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 555761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 555861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; // Temporary counter 555961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 556061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PTR privateAppData = NULL; 556161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan private_handle_t *handle = NULL; 556261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *buff = buffer; 556361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 556461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 556561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 55668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 55678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) port; 55686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 556961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 557061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers"); 557161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_output_headers(); 557261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 557361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_extradata(); 557461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 557561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 557661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 557761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 557861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,i)) { 557961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 558061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5581dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand } 558261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 55836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 558461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i >= drv_ctx.op_buf.actualcount) { 55858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount); 558661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 558761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 558861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 5589f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (eRet != OMX_ErrorNone) 5590f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return eRet; 5591f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 5592576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon if (dynamic_buf_mode) { 5593576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon *bufferHdr = (m_out_mem_ptr + i ); 5594576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon (*bufferHdr)->pBuffer = NULL; 5595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (i == (drv_ctx.op_buf.actualcount - 1) && !streaming[CAPTURE_PORT]) { 5596576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon enum v4l2_buf_type buf_type; 5597576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon int rr = 0; 5598576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 5599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rr = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON, &buf_type)) { 5600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("STREAMON FAILED : %d", rr); 5601576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon return OMX_ErrorInsufficientResources; 5602576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } else { 5603576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon streaming[CAPTURE_PORT] = true; 56048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("STREAMON Successful"); 5605576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 5606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Enabling Turbo mode"); 5608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin request_perf_level(VIDC_TURBO); 5609576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 5610576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon BITMASK_SET(&m_out_bm_count,i); 5611576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon (*bufferHdr)->pAppPrivate = appData; 5612576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon (*bufferHdr)->pBuffer = buffer; 5613576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon (*bufferHdr)->nAllocLen = sizeof(struct VideoDecoderOutputMetaData); 5614576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon return eRet; 5615576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 5616576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 561761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 561861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 561961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 562061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_use_android_native_buffers) { 562161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 562261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sp<android_native_buffer_t> nBuf = params->nativeBuffer; 562361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle = (private_handle_t *)nBuf->handle; 562461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = params->pAppPrivate; 562561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 562661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle = (private_handle_t *)buff; 562761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 562861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5629f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!handle) { 5630f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("handle is invalid"); 5631f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorBadParameter; 5632f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 563361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 563461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) { 5635f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (secure_mode && secure_scaling_to_non_secure_opb) { 5636f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Buffer size expected %u, got %u, but it's ok since we will never map it", 5637f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size); 5638f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 5639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 5640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " expected %u, got %u", 5641f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size); 5642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 5643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5644f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 5645f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 5646f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan drv_ctx.op_buf.buffer_size = handle->size; 564761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 564861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_use_android_native_buffers) { 564961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 565061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buff = (OMX_U8*)mmap(0, handle->size, 565161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 565261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buff == MAP_FAILED) { 565361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 565461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 565561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 56566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 56576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 56586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#if defined(_ANDROID_ICS_) 565961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan native_buffer[i].nativehandle = handle; 566061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan native_buffer[i].privatehandle = handle; 56616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 566261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!handle) { 566361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 566461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 566561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 566661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd; 566761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = 0; 566861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 5669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 567061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size; 567161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 5672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 5673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 567461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!ouput_egl_buffers && !m_use_output_pmem) { 5675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 567661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 567761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment, 567861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.op_buf_ion_info[i].ion_alloc_data, 5679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &drv_ctx.op_buf_ion_info[i].fd_ion_data, 5680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin secure_mode ? SECURE_FLAGS_OUTPUT_BUFFER : 0); 568161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) { 56828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd); 568361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 568461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 568561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 568661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 5687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 568861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 568961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan open (MEM_DEVICE,O_RDWR); 5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 56928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd); 569361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 569461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 569661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */ 569761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) { 569861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 569961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan open (MEM_DEVICE,O_RDWR); 570061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 57018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd); 570261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 570361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 570461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 570661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd, 570761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size, 570861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment)) { 57098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 571061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 571161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 571261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 571461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 571561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = 571661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size, 571761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, 571861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd,0); 571961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) { 572061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 5721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 572261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 5723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 57248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unable to mmap output buffer"); 572561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 572661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 572761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 572861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = 0; 572961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 573061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 573161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 573261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem); 573361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!appData || !bytes ) { 573461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode && !buffer) { 57358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case"); 573661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 573761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 573861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 573961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 574061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list; 574161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info; 574261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData; 5743f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!pmem_list || !pmem_list->entryList || !pmem_list->entryList->entry || 574461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !pmem_list->nEntries || 574561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 57468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pmem info not valid in use buffer"); 574761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 574861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 574961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 575061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list->entryList->entry; 575161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx", 575261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info->pmem_fd); 575361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd; 575461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset; 575561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 575661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = 575761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 575861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan privateAppData = appData; 5759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 576061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 576161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd; 57628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len; 57638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size; 57648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr; 576561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 576661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_out_mem_ptr + i ); 576761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 576861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 576961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 577061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i], 577161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 577261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 57738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i, 577461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr, 577561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd ); 577661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 577761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 577861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 577961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 578061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 578161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 578261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 578361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd; 578461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 578561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 578661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 578761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 578861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 578961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 579061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION 579161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 579261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 579361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 579461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 579561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 57968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 579761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 579861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 579961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 580061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 580161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 580261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) { 58038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to prepare bufs"); 580461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 580561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 5806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 580861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) { 580961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 581061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 581161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) { 581261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 581361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 581461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = true; 58158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("STREAMON Successful"); 581661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Enabling Turbo mode"); 5819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin request_perf_level(VIDC_TURBO); 5820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 582261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size; 582361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 582461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle); 582561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = (OMX_U8 *)handle; 582661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 582761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = buff; 5828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 582961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pAppPrivate = privateAppData; 583061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_out_bm_count,i); 583161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 583261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 5833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 583661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 583761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::use_input_heap_buffers 5838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 583961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 584061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use Buffer Heap allocation method implementation. 5841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 584261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 584361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 584561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 584661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None , if everything successful. 5847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 584861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_input_heap_buffers( 585061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 585161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 585261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 585361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 585461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 585561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 5856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 58578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer); 585861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 58597b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan 58607b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan if (secure_mode) { 58617b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan DEBUG_PRINT_ERROR("use_input_heap_buffers is not allowed in secure mode"); 58627b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan return OMX_ErrorUndefined; 58637b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan } 58647b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan 586561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_heap_ptr) 586661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 586761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 586861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 586961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_phdr_pmem_ptr) 587061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 587161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 587261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 587361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) { 587461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficent memory"); 587561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 587661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) { 587761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input_use_buffer = true; 587861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 587961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 588061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 588161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 588261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 588361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 588461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 588561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes); 58868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]); 58878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[m_in_alloc_cnt], 588861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 58898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 589061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 589161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 589261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_in_alloc_cnt++; 589361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 589461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("All i/p buffers have been set!"); 589561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 589661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 589761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 5898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 590161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 590261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseBuffer 5903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 590461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 590561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use Buffer method implementation. 5906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 590761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 590861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 5909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 591061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 591161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None , if everything successful. 5912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 591361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 5914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_buffer( 591561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 591661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 591761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 591861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 591961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes, 592061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U8* buffer) 5921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 592261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE error = OMX_ErrorNone; 592361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 592461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 5925f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (bufferHdr == NULL || bytes == 0 || (!secure_mode && buffer == NULL)) { 59268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("bad param 0x%p %u 0x%p",bufferHdr, (unsigned int)bytes, buffer); 592761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 5928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 592961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 59308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Use Buffer in Invalid State"); 593161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 5932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 5933ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 5934ee06e61ff49357884de5c6714828c263966895eePraveen Chavan // If this is not the first allocation (i.e m_inp_mem_ptr is allocated), 5935ee06e61ff49357884de5c6714828c263966895eePraveen Chavan // ensure that use-buffer was called for previous allocation. 5936ee06e61ff49357884de5c6714828c263966895eePraveen Chavan // Mix-and-match of useBuffer and allocateBuffer is not allowed 5937ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (m_inp_mem_ptr && !input_use_buffer) { 5938ee06e61ff49357884de5c6714828c263966895eePraveen Chavan DEBUG_PRINT_ERROR("'Use' Input buffer called after 'Allocate' Input buffer !"); 5939ee06e61ff49357884de5c6714828c263966895eePraveen Chavan return OMX_ErrorUndefined; 5940ee06e61ff49357884de5c6714828c263966895eePraveen Chavan } 594161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer); 5942ee06e61ff49357884de5c6714828c263966895eePraveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) 594361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested 594461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 59458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port); 594661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan error = OMX_ErrorBadPortIndex; 594761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 59488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", (unsigned int)port, *bufferHdr, error); 594961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (error == OMX_ErrorNone) { 595061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 595161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Send the callback now 595261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 595361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandStateSet,OMX_StateIdle, 595461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 595561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 595661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated && 595761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 595861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 595961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 596061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX, 596161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 596261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated && 596361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 596461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 596561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 596661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 596761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 596861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 597061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return error; 5971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex, 597461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *pmem_bufferHdr) 5975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 597661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) { 597761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr[bufferindex].pBuffer) 597861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_inp_heap_ptr[bufferindex].pBuffer); 597961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr[bufferindex].pBuffer = NULL; 598061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 598161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_bufferHdr) 598261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(pmem_bufferHdr); 598361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 5984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 5985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 5986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 5987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 598861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 598961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || m_inp_mem_ptr == NULL) { 599061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 599161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 5992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 599361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufferHdr - m_inp_mem_ptr; 59948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); 599561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 59960c95c078771f637924fa7ae01b0d90df285dde64Ray Essick auto_lock l(buf_lock); 599797e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan bufferHdr->pInputPortPrivate = NULL; 599897e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan 599961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) { 60008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); 6001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ptr_inputbuffer[index].pmem_fd >= 0) { 600261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 600361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT; 600461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index], 600561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 600661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 60078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the input buffer fd=%d", 60086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal drv_ctx.ptr_inputbuffer[index].pmem_fd); 6009f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("unmap the input buffer size=%u address = %p", 6010f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)drv_ctx.ptr_inputbuffer[index].mmaped_size, 601161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer[index].bufferaddr); 601261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr, 601361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer[index].mmaped_size); 60144173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan close (drv_ctx.ptr_inputbuffer[index].pmem_fd); 60154173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan } else if (allocate_native_handle){ 60164173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan native_handle_t *nh = (native_handle_t *)bufferHdr->pBuffer; 60174173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan native_handle_close(nh); 60184173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan native_handle_delete(nh); 601961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 602061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer[index].pmem_fd = -1; 602161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) { 602261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_desc_buffer_ptr[index].buf_addr); 602361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].buf_addr = NULL; 602461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].desc_data_size = 0; 602561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 602761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.ip_buf_ion_info[index]); 6028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 602961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 603261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 6036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 603761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 6038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 603961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL || m_out_mem_ptr == NULL) { 604061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 604161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 604361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufferHdr - m_out_mem_ptr; 60448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index); 6045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 604661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < drv_ctx.op_buf.actualcount 604761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_outputbuffer) { 60488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %p", index, 604961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[index].bufferaddr); 6050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 605161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 605261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 605361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index], 605461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof (vdec_bufferpayload)); 6055a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan 6056a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan if (!dynamic_buf_mode) { 6057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (streaming[CAPTURE_PORT] && 6058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !(in_reconfig || BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING))) { 6059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) { 6060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("STREAMOFF Failed"); 6061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 6062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("STREAMOFF Successful"); 6063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 6066a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan if (m_enable_android_native_buffers) { 606761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 6068a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) { 6069a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr, 6070a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan drv_ctx.ptr_outputbuffer[index].mmaped_size); 6071a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan } 607261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6073a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 6074a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan } else { 6075a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan#endif 6076a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) { 6077a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan if (!secure_mode) { 60788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("unmap the output buffer fd = %d", 6079a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan drv_ctx.ptr_outputbuffer[0].pmem_fd); 6080f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("unmap the ouput buffer size=%u address = %p", 6081f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount, 6082a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan drv_ctx.ptr_outputbuffer[0].bufferaddr); 6083a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr, 6084a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount); 6085a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan } 6086a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan close (drv_ctx.ptr_outputbuffer[0].pmem_fd); 6087a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan drv_ctx.ptr_outputbuffer[0].pmem_fd = -1; 6088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 6089a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[0]); 6090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6091a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan } 6092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 6093a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan } 6094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6095a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan } //!dynamic_buf_mode 609661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 609761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_extradata(); 609861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 60996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 6100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 610161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 6102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 610661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE **bufferHdr, 610761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 port, 610861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PTR appData, 610961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 bytes) 6110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 611161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *input = NULL; 611261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *buf_addr = NULL; 611361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 611461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i = 0; 611561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 611661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Sanity Check*/ 611761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bufferHdr == NULL) { 611861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 612161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr == NULL) { 612261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \ 612361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 612461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 612561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \ 612661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 612761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 612861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6129f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (m_inp_heap_ptr == NULL || m_phdr_pmem_ptr == NULL) { 6130f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("m_inp_heap_ptr or m_phdr_pmem_ptr Allocation failed "); 613161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 613261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 613361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 613461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 613561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Find a Free index*/ 613661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 613761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) { 61388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer Index %d",i); 613961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 614061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 614361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.ip_buf.actualcount) { 614461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size); 6145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 614661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_addr == NULL) { 614761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 614861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 614961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 615061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_inp_heap_ptr + i); 615161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input = *bufferHdr; 615261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_heap_inp_bm_count,i); 615361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 615461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pBuffer = (OMX_U8 *)buf_addr; 615561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 615661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nVersion.nVersion = OMX_SPEC_VERSION; 615761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nAllocLen = drv_ctx.ip_buf.buffer_size; 615861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pAppPrivate = appData; 615961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 61608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr ); 616161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes); 61628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]); 616361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Add the Buffers to freeq*/ 61648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[i], 616561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 61668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 616761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 616861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 616961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 617061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 617361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 6174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 617961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 618061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateInputBuffer 6181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 618261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 618361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper function for allocate buffer in the input pin 6184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 618561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 618661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 6187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 618861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 618961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 6190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 619161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 6192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_buffer( 619361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 619461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 619561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 619661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 619761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 6198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 619961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 620061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 620161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *input = NULL; 620261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i = 0; 620361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *buf_addr = NULL; 620417322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara int pmem_fd = -1, ret = 0; 620561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 62068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 62078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) port; 62088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 62098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 621061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bytes != drv_ctx.ip_buf.buffer_size) { 6211f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("Requested Size is wrong %u epected is %u", 6212f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)bytes, (unsigned int)drv_ctx.ip_buf.buffer_size); 621361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 6214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 621661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_mem_ptr) { 621717322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara struct v4l2_requestbuffers bufreq; 621817322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara bufreq.memory = V4L2_MEMORY_USERPTR; 621917322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 622017322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara bufreq.count = drv_ctx.ip_buf.actualcount; 622117322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 622217322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara if (ret) { 622317322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %s", strerror(errno)); 622417322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara /*TODO: How to handle this case */ 622517322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara eRet = OMX_ErrorInsufficientResources; 622617322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara } else if (bufreq.count != drv_ctx.ip_buf.actualcount) { 622717322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara DEBUG_PRINT_ERROR("%s Count(%d) is not expected to change to %d", 622817322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara __FUNCTION__, drv_ctx.ip_buf.actualcount, bufreq.count); 622917322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara eRet = OMX_ErrorInsufficientResources; 623017322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara } 623117322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara 6232f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%u)", 623361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount, 6234f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)drv_ctx.ip_buf.buffer_size); 6235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 623661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 623761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 623861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 623961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr == NULL) { 624061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 624161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 624261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 624361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \ 624461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount); 624561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 624661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer == NULL) { 624761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 624861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 625061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \ 625161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount); 6252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 625361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ip_buf_ion_info == NULL) { 625461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 625561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 625861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.ip_buf.actualcount; i++) { 625961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].pmem_fd = -1; 6260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 626161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1; 6262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 626361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 626661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 626761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 62688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Input Buffer Index %d",i); 626961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 627061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 627361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.ip_buf.actualcount) { 627461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 627561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 627661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 62778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocate input Buffer"); 6278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 627961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 62800c95c078771f637924fa7ae01b0d90df285dde64Ray Essick drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment, 628161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ip_buf_ion_info[i].ion_alloc_data, 6282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? 6283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SECURE_FLAGS_INPUT_BUFFER : ION_FLAG_CACHED); 628461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) { 628561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 628661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 628761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd; 6288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 628961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 6290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 629161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 62928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer"); 629361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 629461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 629661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd == 0) { 629761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 6298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 629961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 63008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer"); 630161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 630261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 630361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 630561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size, 630661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.alignment)) { 63078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 630861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 630961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 631061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 631261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 631361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_addr = (unsigned char *)mmap(NULL, 631461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.buffer_size, 631561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0); 6316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 631761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_addr == MAP_FAILED) { 631861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 6319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 632061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.ip_buf_ion_info[i]); 6321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 63228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Map Failed to allocate input buffer"); 632361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 632461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 632561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 632661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_inp_mem_ptr + i); 632761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) 632861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr; 632961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 633061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr; 633161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd; 633261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 633361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size; 633461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer [i].offset = 0; 633561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 633661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 633761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 633861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 633961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 634061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.bytesused = 0; 634161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size; 634261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr; 634361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd; 634461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[1] = 0; 634561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset; 634661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = &plane; 634761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = 1; 634861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 63498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %p", i, 635061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer[i].bufferaddr); 635161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 635261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 635361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 635461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 63558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to prepare bufs"); 635661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 635761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 6358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 636061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input = *bufferHdr; 636161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_inp_bm_count,i); 63628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr); 63634173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan if (allocate_native_handle) { 63644173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan native_handle_t *nh = native_handle_create(1 /*numFds*/, 0 /*numInts*/); 63654173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan nh->data[0] = drv_ctx.ptr_inputbuffer[i].pmem_fd; 63664173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan input->pBuffer = (OMX_U8 *)nh; 63674173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan } else if (secure_mode || m_input_pass_buffer_fd) { 63684173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan /*Legacy method, pass ion fd stashed directly in pBuffer*/ 6369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->pBuffer = (OMX_U8 *)(intptr_t)drv_ctx.ptr_inputbuffer[i].pmem_fd; 63704173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan } else { 63714173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan input->pBuffer = (OMX_U8 *)buf_addr; 63724173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan } 637361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 637461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nVersion.nVersion = OMX_SPEC_VERSION; 637561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nAllocLen = drv_ctx.ip_buf.buffer_size; 637661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pAppPrivate = appData; 637761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 637861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; 637961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 638061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.disable_dmx) { 638161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_desc_buffer(i); 638261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 638361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 63848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found"); 638561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 638661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 638761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 6388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 639261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 639361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateOutputBuffer 6394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 639561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 639661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Helper fn for AllocateBuffer in the output pin 6397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 639861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 639961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 6400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 640161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 640261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went well. 6403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 640461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 6405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_buffer( 640661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 640761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 640861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 640961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 641061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 6411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 64128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void)hComp; 64138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void)port; 641461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 641561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 641661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; // Temporary counter 641761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_setbuffer_cmd setbuffers; 641861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 6419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 642061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ion_device_fd =-1; 642161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_allocation_data ion_alloc_data; 642261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_fd_data fd_ion_data; 6423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 642461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 6425f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%u)", 642661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount, 6427f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)drv_ctx.op_buf.buffer_size); 642861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nBufHdrSize = 0; 642961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformEntrySize = 0; 643061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformListSize = 0; 643161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPMEMInfoSize = 0; 643261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int pmem_fd = -1; 643361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned char *pmem_baseaddress = NULL; 643461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 643561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 643661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 643761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 643861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 64398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)", 644061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 644161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufHdrSize = drv_ctx.op_buf.actualcount * 644261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE); 644361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 644461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize = drv_ctx.op_buf.actualcount * 644561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 644661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize = drv_ctx.op_buf.actualcount * 644761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 644861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformEntrySize = drv_ctx.op_buf.actualcount * 644961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 645061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6451f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize, 6452f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)sizeof(OMX_BUFFERHEADERTYPE), 645361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize, 645461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize); 64558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize, 645661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 6457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 6458f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // Allocate output buffers as cached to improve performance of software-reading 6459f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // of the YUVs. Output buffers are cache-invalidated in driver. 6460f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // If color-conversion is involved, Only the C2D output buffers are cached, no 6461f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // need to cache the decoder's output buffers 6462f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan int cache_flag = client_buffers.is_color_conversion_enabled() ? 0 : ION_FLAG_CACHED; 646361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_device_fd = alloc_map_ion_memory( 646461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount, 6465f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan secure_scaling_to_non_secure_opb ? SZ_4K : drv_ctx.op_buf.alignment, 6466f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan &ion_alloc_data, &fd_ion_data, 6467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (secure_mode && !secure_scaling_to_non_secure_opb) ? 6468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SECURE_FLAGS_OUTPUT_BUFFER : cache_flag); 646961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ion_device_fd < 0) { 647061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 647161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 647261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = fd_ion_data.fd; 6473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 647461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd = open (MEM_DEVICE,O_RDWR); 6475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 647661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_fd < 0) { 64778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d", 647861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size); 647961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 648061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 648261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size * 648361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount, 648461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.alignment)) { 64858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 648661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 648761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 648861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 649061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!secure_mode) { 649161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress = (unsigned char *)mmap(NULL, 649261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.op_buf.buffer_size * 649361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount), 649461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0); 649561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_baseaddress == MAP_FAILED) { 6496f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("MMAP failed for Size %u", 6497f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)drv_ctx.op_buf.buffer_size); 649861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd); 6499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 650061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 6501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 650261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 650361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 650461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 650561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 650661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Alloc mem for platform specific info 650761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *pPtr=NULL; 650861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 650961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize,1); 651061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\ 651161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_bufferpayload), 651261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 651361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 651461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_output_frameinfo), 651561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 6516f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) { 6517f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer "); 6518f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorInsufficientResources; 6519f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 6520f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 6521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 652261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = (struct vdec_ion *)\ 652361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_ion), 652461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 6525f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!drv_ctx.op_buf_ion_info) { 6526f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info"); 6527f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorInsufficientResources; 6528f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 6529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 653161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 653261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_respbuffer) { 653361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[0].mmaped_size = 653461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.op_buf.buffer_size * 653561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 653661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr = m_out_mem_ptr; 653761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 653861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 653961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_list) + nPlatformListSize); 654061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 654161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_entry) + nPlatformEntrySize); 654261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList = m_platform_list; 654361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry = m_platform_entry; 654461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = m_pmem_info; 654561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 65468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 654761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 654861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Settting the entire storage nicely 65498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry); 65508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo); 655161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 655261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 655361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 655461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Set the values when we determine the right HxW param 655561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nAllocLen = bytes; 655661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nFilledLen = 0; 655761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pAppPrivate = appData; 655861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 655961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Platform specific PMEM Information 656061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform Entry 65618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i); 656261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 656361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->entry = pPMEMInfo; 656461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform List 656561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->nEntries = 1; 656661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->entryList = pPlatformEntry; 656761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep pBuffer NULL till vdec is opened 656861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pBuffer = NULL; 656961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOffset = 0; 657061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 657161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->offset = drv_ctx.op_buf.buffer_size*i; 6572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pPMEMInfo->pmem_fd = -1; 657361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pPlatformPrivate = pPlatformList; 657461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 657561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd; 657661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].pmem_fd = pmem_fd; 6577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 657861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd; 657961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data; 658061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data; 6581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 6582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 658361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create a mapping between buffers*/ 658461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 658561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer[i].client_data = (void *)\ 658661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ptr_outputbuffer[i]; 658761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i; 658861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = 658961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i); 65908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len; 65918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size; 65928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr; 659361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 6594f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("pmem_fd = %d offset = %u address = %p", 6595f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pmem_fd, (unsigned int)drv_ctx.ptr_outputbuffer[i].offset, 659661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr); 659761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the buffer and buffer header pointers 659861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr++; 659961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo++; 660061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry++; 660161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList++; 660261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 660361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 66048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\ 660561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr, pPtr); 660661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 660761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_out_mem_ptr); 660861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 660961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 661061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pPtr) { 661161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(pPtr); 661261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = NULL; 661361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 661461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 661561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_outputbuffer); 661661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 661761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 661861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 661961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_respbuffer); 662061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 662161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 662361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info) { 66248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free o/p ion context"); 662561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 662661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = NULL; 662761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 662961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 663061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 663161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) 663261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_extradata(); 6633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 663561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 663661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,i)) { 66378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i); 663861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 663961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 664261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 664361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i < drv_ctx.op_buf.actualcount) { 664461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 664561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 664661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 664761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 664861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 664961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].buffer_len = 665061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.buffer_size; 665161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 665261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = (m_out_mem_ptr + i ); 665361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (secure_mode) { 6654f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef USE_ION 6655f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = 6656f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (OMX_U8 *)(intptr_t)drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 6657f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#else 665861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 6659f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif 666061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 666161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size; 666261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 666361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = i; 666461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 666561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 666661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].length = drv_ctx.op_buf.buffer_size; 666761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 666861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 6669b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#ifdef USE_ION 667061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 6671b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#endif 667261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 667361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 667461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 667561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 667661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 667761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 66786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 667961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 66806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 668161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 668261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 668361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 66848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx); 668561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 668661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 668761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 668861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 66898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr); 669061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 669161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 669261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 669361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 669461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 669561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 669661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) { 669761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 669861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 669961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 670061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 670161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 670261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 670361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[CAPTURE_PORT] = true; 67048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("STREAMON Successful"); 670561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Enabling Turbo mode"); 6708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin request_perf_level(VIDC_TURBO); 670961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 671061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 671161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr; 671261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (*bufferHdr)->pAppPrivate = appData; 671361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_SET(&m_out_bm_count,i); 671461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 67158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient"); 671661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 671761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 672061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 6721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer -- API Call 6725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 672661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 672761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateBuffer 6728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 672961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 673061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Returns zero if all the buffers released.. 6731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 673261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 673361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 6734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 673561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 673661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 6737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 673861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 6739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp, 674061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 674161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 674261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 674361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 bytes) 6744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned i = 0; 6746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type 6747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 67488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port); 674961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateInvalid) { 67508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Allocate Buf in Invalid State"); 6751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInvalidState; 6752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 675461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 6755ee06e61ff49357884de5c6714828c263966895eePraveen Chavan // If this is not the first allocation (i.e m_inp_mem_ptr is allocated), 6756ee06e61ff49357884de5c6714828c263966895eePraveen Chavan // ensure that use-buffer was never called. 6757ee06e61ff49357884de5c6714828c263966895eePraveen Chavan // Mix-and-match of useBuffer and allocateBuffer is not allowed 6758ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (m_inp_mem_ptr && input_use_buffer) { 6759ee06e61ff49357884de5c6714828c263966895eePraveen Chavan DEBUG_PRINT_ERROR("'Allocate' Input buffer called after 'Use' Input buffer !"); 6760ee06e61ff49357884de5c6714828c263966895eePraveen Chavan return OMX_ErrorUndefined; 6761ee06e61ff49357884de5c6714828c263966895eePraveen Chavan } 676261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 676361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes); 676461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 676561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes); 676661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 676761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 67686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port, 67696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal appData,bytes); 677061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 67718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port); 677261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 6773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done"); 677561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet == OMX_ErrorNone) { 677661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocate_done()) { 677761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 6778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 6779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 6780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet,OMX_StateIdle, 678161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 6782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 678461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) { 678561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 678661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 678761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortEnable, 6788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_CORE_INPUT_PORT_INDEX, 6789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_EVENT); 679061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 679261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) { 679361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 679461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 6795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortEnable, 679661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 679761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 6798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 68018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet); 6802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 6803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call 6806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 680761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 680861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::FreeBuffer 6809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 681061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 6811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 681261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 681361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 6814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 681561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 681661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 6817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 681861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 6819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp, 682061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 682161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 6822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 6823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_ERRORTYPE eRet = OMX_ErrorNone; 6824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev unsigned int nPortIndex; 68258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 68268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("In for decoder free_buffer"); 6827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 682861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state == OMX_StateIdle && 682961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 68308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" free buffer while Component in Loading pending"); 683161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)|| 683261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) { 68338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Buffer while port %u disabled", (unsigned int)port); 683461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ((port == OMX_CORE_INPUT_PORT_INDEX && 683561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) || 683661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (port == OMX_CORE_OUTPUT_PORT_INDEX && 683761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) { 68388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Buffer while port %u enable pending", (unsigned int)port); 683961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) { 68408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled"); 6841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError, 684261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorPortUnpopulated, 684361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 68440c95c078771f637924fa7ae01b0d90df285dde64Ray Essick 6845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorIncorrectStateOperation; 684661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_state != OMX_StateInvalid) { 68478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers"); 6848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_EventError, 684961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ErrorPortUnpopulated, 685061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 6851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 685361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 685461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if arbitrary bytes*/ 685561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes && !input_use_buffer) 685661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer - m_inp_mem_ptr; 685761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 685861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer - m_inp_heap_ptr; 6859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 68608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex); 6861fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan if (nPortIndex < drv_ctx.ip_buf.actualcount && 6862fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan BITMASK_PRESENT(&m_inp_bm_count, nPortIndex)) { 686361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Clear the bit associated with it. 686461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); 686561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex); 686661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 686761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 68688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex); 686961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) 687061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(m_phdr_pmem_ptr[nPortIndex]); 687161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 687261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 687361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) 687461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]); 687561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 687661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(nPortIndex,NULL); 687761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 687861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer(buffer); 6879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 688061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated = OMX_FALSE; 68818b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan if(release_input_done()) 68828b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan release_buffers(this, VDEC_BUFFER_TYPE_INPUT); 688361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Free the Buffer Header*/ 688461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_input_done()) { 68858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("ALL input buffers are freed/released"); 688661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_input_buffer_header(); 688761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 688861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 68898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid"); 6890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 6891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 689361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING) 689461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_input_done()) { 68958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 6896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING); 6897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandPortDisable, 689861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_INPUT_PORT_INDEX, 689961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 6900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 690161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 6902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // check if the buffer is valid 69036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 6904fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan if (nPortIndex < drv_ctx.op_buf.actualcount && 6905fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan BITMASK_PRESENT(&m_out_bm_count, nPortIndex)) { 69068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex); 6907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Clear the bit associated with it. 6908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR(&m_out_bm_count,nPortIndex); 6909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_out_bPopulated = OMX_FALSE; 69106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal client_buffers.free_output_buffer (buffer); 6911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 69128b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan if(release_output_done()) { 69138b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan release_buffers(this, VDEC_BUFFER_TYPE_OUTPUT); 69148b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan } 691561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 691661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_output_buffer_header(); 6917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 691861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 69198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid"); 6920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 6921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 692261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING) 692361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && release_output_done()) { 69248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it"); 6925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 69268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 692761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 69286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_ 692961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_enable_android_native_buffers) { 693061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers"); 693161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 693261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 69336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 6934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 693561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_CommandPortDisable, 693661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_CORE_OUTPUT_PORT_INDEX, 693761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 6938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 693961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 6940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev eRet = OMX_ErrorBadPortIndex; 6941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 694261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((eRet == OMX_ErrorNone) && 694361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 694461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_done()) { 6945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Send the callback now 6946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); 6947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev post_event(OMX_CommandStateSet, OMX_StateLoaded, 694861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT); 6949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 6951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return eRet; 6952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 6953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 6955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 695661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 695761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::EmptyThisBuffer 6958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 695961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 696061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan This routine is used to push the encoded video frames to 696161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan the video decoder. 6962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 696361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 696461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 6965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 696661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 696761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went successful. 6968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 696961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 6970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 697161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 6972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 697361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret1 = OMX_ErrorNone; 697461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount; 697561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 697697e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan if (m_state != OMX_StateExecuting && 697797e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan m_state != OMX_StatePause && 697897e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan m_state != OMX_StateIdle) { 69798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Empty this buffer in Invalid State"); 698061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInvalidState; 698161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 698261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 698361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL) { 69848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL"); 698561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 698661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 698761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 698861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_inp_bEnabled) { 69898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled."); 699061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 699161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 699261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 699361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) { 69948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %u", (unsigned int)buffer->nInputPortIndex); 699561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 699661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 6997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 699861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 699961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!latency) { 700061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.stop(); 700161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan latency = dec_time.processing_time_us(); 700261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 700361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 700461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 700561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 700661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 700761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_heap_ptr; 700861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 700961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 701061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_heap_ptr; 7011ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) { 7012ee06e61ff49357884de5c6714828c263966895eePraveen Chavan DEBUG_PRINT_ERROR("ERROR: ETB nBufferIndex is invalid in use-buffer mode"); 7013ee06e61ff49357884de5c6714828c263966895eePraveen Chavan return OMX_ErrorBadParameter; 7014ee06e61ff49357884de5c6714828c263966895eePraveen Chavan } 701561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen; 701661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp; 701761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags; 701861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = &m_inp_mem_ptr[nBufferIndex]; 70198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %u", 70208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, (unsigned int)buffer->nFilledLen); 702161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 702261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufferIndex = buffer - m_inp_mem_ptr; 702361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 702461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 702561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 7026ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) { 70278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid"); 702861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 702961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 703061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 7031a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 7032a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan codec_config_flag = true; 7033a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__); 7034a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } 7035a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan 7036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* The client should not set this when codec is in arbitrary bytes mode */ 7037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_input_pass_buffer_fd) { 7038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->pBuffer = (OMX_U8*)drv_ctx.ptr_inputbuffer[nBufferIndex].bufferaddr; 7039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 70418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%u)", 70428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan buffer, buffer->pBuffer, buffer->nTimeStamp, (unsigned int)buffer->nFilledLen); 704361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 70448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan post_event ((unsigned long)hComp,(unsigned long)buffer, 7045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_COMPONENT_GENERATE_ETB_ARBITRARY); 704661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 70478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan post_event ((unsigned long)hComp,(unsigned long)buffer,OMX_COMPONENT_GENERATE_ETB); 704861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7049f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan time_stamp_dts.insert_timestamp(buffer); 705061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 7051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 705461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 705561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::empty_this_buffer_proxy 7056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 705761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 705861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan This routine is used to push the encoded video frames to 705961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan the video decoder. 7060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 706161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 706261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 7063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 706461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 706561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything went successful. 7066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 706761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 70688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, 706961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 7070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 70718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 707261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int push_cnt = 0,i=0; 707361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned nPortIndex = 0; 707461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 707561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_input_frameinfo frameinfo; 707661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload *temp_buffer; 707761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_seqheader seq_header; 707861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool port_setting_changed = true; 707961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 708061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Should we generate a Aync error event*/ 708161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || buffer->pInputPortPrivate == NULL) { 70828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid"); 708361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 708461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 708561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 708661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 708761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 7088ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (nPortIndex >= drv_ctx.ip_buf.actualcount) { 70898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]", 709061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex); 709161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 709261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 709361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 709461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_input_buffers++; 709561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 709661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return zero length and not an EOS buffer */ 709761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes && (buffer->nFilledLen == 0) && 709861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) { 70998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("return zero legth buffer"); 71008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan post_event ((unsigned long)buffer,VDEC_S_SUCCESS, 710161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 710261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 710361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7105f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (input_flush_progress == true) { 71068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Flush in progress return buffer "); 71078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan post_event ((unsigned long)buffer,VDEC_S_SUCCESS, 710861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 710961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 711061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 711297e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan auto_lock l(buf_lock); 711361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate; 7114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 711597e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan if (!temp_buffer || (temp_buffer - drv_ctx.ptr_inputbuffer) > (int)drv_ctx.ip_buf.actualcount) { 711661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 711761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 711861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* If its first frame, H264 codec and reject is true, then parse the nal 711961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan and get the profile. Based on this, reject the clip playback */ 712061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 && 712161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_reject_avc_1080p_mp) { 712261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan first_frame = 1; 71238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Parse nal to get the profile"); 712461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)buffer->pBuffer, buffer->nFilledLen, 712561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NALU_TYPE_SPS); 712661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_profile = h264_parser->get_profile(); 712761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = is_video_session_supported(); 712861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 71298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan post_event ((unsigned long)buffer,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_EBD); 713061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event(OMX_EventError, OMX_ErrorInvalidState,OMX_COMPONENT_GENERATE_EVENT); 713161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* Move the state to Invalid to avoid queueing of pending ETB to the driver */ 713261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state = OMX_StateInvalid; 713361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 713461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 713561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 71378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 713861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*for use buffer we need to memcpy the data*/ 713961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan temp_buffer->buffer_len = buffer->nFilledLen; 714061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 71417b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan if (input_use_buffer && temp_buffer->bufferaddr && !secure_mode) { 714261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFilledLen <= temp_buffer->buffer_len) { 714361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 714461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 714561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 714661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset), 714761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen); 714861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 714961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 715061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 715161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 715561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.bufferaddr = temp_buffer->bufferaddr; 715661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.client_data = (void *) buffer; 715761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.datalen = temp_buffer->buffer_len; 715861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags = 0; 715961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.offset = buffer->nOffset; 716061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_fd = temp_buffer->pmem_fd; 716161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.pmem_offset = temp_buffer->offset; 716261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.timestamp = buffer->nTimeStamp; 716361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) { 716461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("ETB: dmx enabled"); 716561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_demux_entries == 0) { 716661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extract_demux_addr_offsets(buffer); 716761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 716861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 71698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%u",(unsigned int)m_demux_entries); 717061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan handle_demux_data(buffer); 717161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr; 717261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size; 717361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 717461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_addr = NULL; 717561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.desc_size = 0; 7176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 717761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!arbitrary_bytes) { 717861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= buffer->nFlags; 717961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 718061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 718161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ 718261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 718361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 71848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 718561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.insert_ts(buffer->nTimeStamp); 718661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 71878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 718861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.insert_ts(buffer->nTimeStamp); 718961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 71934173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan log_input_buffers((const char *)temp_buffer->bufferaddr, temp_buffer->buffer_len); 7194073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava 7195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinif (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { 7196073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 719761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 719861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 719961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 720061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 72018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached"); 720261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frameinfo.flags |= VDEC_BUFFERFLAG_EOS; 720361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 720461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count = 0; 720561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 720661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count = 0; 720761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils) 720861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->initialize_frame_checking_environment(); 720961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.flush(); 721061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 721161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = 0; 721261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 721361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 721461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 721561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 721661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane; 721761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&buf, 0, sizeof(buf)); 721861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&plane, 0, sizeof(plane)); 721961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc; 722061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned long print_count; 722161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 72228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan buf.flags = V4L2_QCOM_BUF_FLAG_EOS; 72238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("INPUT EOS reached") ; 722461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 722561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 722661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = nPortIndex; 722761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 722861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 722961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.bytesused = temp_buffer->buffer_len; 723061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.length = drv_ctx.ip_buf.buffer_size; 723161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.m.userptr = (unsigned long)temp_buffer->bufferaddr - 723261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)temp_buffer->offset; 723361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[0] = temp_buffer->pmem_fd; 723461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.reserved[1] = temp_buffer->offset; 723561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane.data_offset = 0; 723661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = &plane; 723761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = 1; 723861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frameinfo.timestamp >= LLONG_MAX) { 723961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID; 724061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 724161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //assumption is that timestamp is in milliseconds 724261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.timestamp.tv_sec = frameinfo.timestamp / 1000000; 724361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000); 724461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0; 724561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_DECODEONLY) ? V4L2_QCOM_BUF_FLAG_DECODEONLY: 0; 724661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 7247f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 7248f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("Increment codec_config buffer counter"); 7249f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan android_atomic_inc(&m_queued_codec_config_count); 7250f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 7251f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 725261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 725361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 72548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver"); 725561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 725661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 72578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 7258a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 7259a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan codec_config_flag = false; 7260a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } 726161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!streaming[OUTPUT_PORT]) { 726261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type buf_type; 726361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret,r; 726461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 726561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 72668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 726761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 726861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!ret) { 72698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful"); 727061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[OUTPUT_PORT] = true; 7271f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else if (errno == EBUSY) { 7272f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Failed to call stream on OUTPUT due to HW_OVERLOAD"); 7273f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan post_event ((unsigned long)buffer, VDEC_S_SUCCESS, 7274f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_COMPONENT_GENERATE_EBD); 7275f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorInsufficientResources; 727661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 72778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT"); 727861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued"); 7279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event ((unsigned long)buffer, VDEC_S_SUCCESS, 728061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 728161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 728261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 728361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7284f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%u)", 7285f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan frameinfo.bufferaddr, (long long)frameinfo.timestamp, 7286f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)frameinfo.datalen); 7287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 728861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 7289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 729261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 729361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::FillThisBuffer 7294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 729561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 729661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL client uses this method to release the frame buffer 729761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan after displaying them. 7298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 729961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 730061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 7301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 730261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 730361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 7304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 730561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 7306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 730761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* buffer) 7308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 730997e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan if (m_state != OMX_StateExecuting && 731097e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan m_state != OMX_StatePause && 731197e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan m_state != OMX_StateIdle) { 731297e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan DEBUG_PRINT_ERROR("FTB in Invalid State"); 731397e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan return OMX_ErrorInvalidState; 731497e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan } 731597e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan 731697e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan if (!m_out_bEnabled) { 731797e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled."); 731897e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan return OMX_ErrorIncorrectStateOperation; 731997e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan } 732097e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan 7321f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan unsigned nPortIndex = 0; 7322576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon if (dynamic_buf_mode) { 7323576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon private_handle_t *handle = NULL; 7324576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon struct VideoDecoderOutputMetaData *meta; 7325576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon unsigned int nPortIndex = 0; 7326576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 7327576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon if (!buffer || !buffer->pBuffer) { 7328f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("%s: invalid params: %p", __FUNCTION__, buffer); 7329576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon return OMX_ErrorBadParameter; 7330576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 7331576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 7332576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon //get the buffer type and fd info 7333576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon meta = (struct VideoDecoderOutputMetaData *)buffer->pBuffer; 7334576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon handle = (private_handle_t *)meta->pHandle; 73358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FTB: metabuf: %p buftype: %d bufhndl: %p ", meta, meta->eType, meta->pHandle); 7336576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 73378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!handle) { 73388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("FTB: Error: IL client passed an invalid buf handle - %p", handle); 73398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorBadParameter; 73408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 7341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //Fill outputbuffer with buffer details, this will be sent to f/w during VIDIOC_QBUF 7342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 7343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (nPortIndex < drv_ctx.op_buf.actualcount && 7344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) { 7345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd = handle->fd; 7346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = (OMX_U8*) buffer; 7347576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 7348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //Store private handle from GraphicBuffer 7349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin native_buffer[nPortIndex].privatehandle = handle; 7350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin native_buffer[nPortIndex].nativehandle = handle; 7351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 7352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("[FTB]Invalid native_buffer index: %d", nPortIndex); 7353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 7354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7355f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 7356f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan //buffer->nAllocLen will be sizeof(struct VideoDecoderOutputMetaData). Overwrite 7357f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan //this with a more sane size so that we don't compensate in rest of code 7358f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan //We'll restore this size later on, so that it's transparent to client 7359f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan buffer->nFilledLen = 0; 7360f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan buffer->nAllocLen = handle->size; 7361bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch drv_ctx.op_buf.buffer_size = handle->size; 7362576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 7363576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 7364f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 736561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL || 7366f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (nPortIndex >= drv_ctx.op_buf.actualcount)) { 7367f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index, nPortIndex %u bufCount %u", 7368f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan nPortIndex, drv_ctx.op_buf.actualcount); 736961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 737061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 737161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 737261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) { 73738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %u", (unsigned int)buffer->nOutputPortIndex); 737461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadPortIndex; 737561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 737661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 737761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 73788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan post_event((unsigned long) hComp, (unsigned long)buffer, m_fill_output_msg); 737961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 7380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 738261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 738361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::fill_this_buffer_proxy 738461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 738561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 738661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan IL client uses this method to release the frame buffer 738761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan after displaying them. 738861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 738961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 739061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 739161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 739261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 739361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 739461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 739561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 739661a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( 739761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp, 739861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd) 739961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 740061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE nRet = OMX_ErrorNone; 740161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer = bufferAdd; 740261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned nPortIndex = 0; 740361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_fillbuffer_cmd fillbuffer; 740461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_bufferpayload *ptr_outputbuffer = NULL; 740561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_output_frameinfo *ptr_respbuffer = NULL; 740661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 740761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 740861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 7409ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (bufferAdd == NULL || nPortIndex >= drv_ctx.op_buf.actualcount) { 7410f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u", 7411f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan nPortIndex, drv_ctx.op_buf.actualcount); 741261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 7413f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 7414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 74158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p", 741661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufferAdd, bufferAdd->pBuffer); 741761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Return back the output buffer to client*/ 741861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) { 74198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Output Buffers return flush/disable condition"); 742061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 742161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,buffer); 742261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 742361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 74248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 74255a9eab657a9f229a6ed3700f27dc1253a8eaddfbArun Menon if (dynamic_buf_mode) { 7426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[nPortIndex].offset = 0; 7427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len = buffer->nAllocLen; 7428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_ref_add(nPortIndex); 7429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[nPortIndex].mmaped_size = buffer->nAllocLen; 74305a9eab657a9f229a6ed3700f27dc1253a8eaddfbArun Menon } 74318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 743261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers++; 743361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer = client_buffers.get_dr_buf_hdr(bufferAdd); 7434f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!buffer) { 7435f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("err: client_buffer ptr invalid"); 7436f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorBadParameter; 7437f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 743861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate; 743961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptr_respbuffer) { 744061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data; 744161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 744361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) { 744461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL"); 744561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 744661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,buffer); 744761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers--; 744861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 744961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 745161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 745261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer buf; 745361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_plane plane[VIDEO_MAX_PLANES]; 745461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)&buf, 0, sizeof(buf)); 745561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES)); 7456f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan unsigned int extra_idx = 0; 7457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 745861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.index = nPortIndex; 745961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 746061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.memory = V4L2_MEMORY_USERPTR; 746161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].bytesused = buffer->nFilledLen; 7462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].length = buffer->nAllocLen; 746361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].m.userptr = 746461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr - 746561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset; 746661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 746761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset; 746861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[0].data_offset = 0; 746961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 747061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 747161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].bytesused = 0; 747261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 747361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size); 74746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 747561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 74766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 747761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size; 747861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan plane[extra_idx].data_offset = 0; 747961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 7480f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx); 748161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 748261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 748361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.m.planes = plane; 748461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf.length = drv_ctx.num_planes; 7485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("SENDING FTB TO F/W - fd[0] = %d fd[1] = %d offset[1] = %d in_flush = %d", 7486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], output_flush_progress); 7487576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 748861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 748961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 749061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 749161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Failed to qbuf to driver"); 749261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinreturn OMX_ErrorNone; 7494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 749761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 749861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::SetCallbacks 7499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 750061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 750161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Set the callbacks. 7502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 750361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 750461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 7505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 750661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 750761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 7508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 750961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 7510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE hComp, 751161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_CALLBACKTYPE* callbacks, 751261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData) 7513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 75148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 751561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb = *callbacks; 75168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\ 751761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EventHandler,m_cb.FillBufferDone); 751861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_app_data = appData; 751961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNotImplemented; 7520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 752361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 752461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentDeInit 7525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 752661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 752761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Destroys the component and release memory allocated to the heap. 7528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 752961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 753061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 7531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 753261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 753361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything successful. 7534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 753561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 7536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp) 7537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 75388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 7539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 75406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal unsigned i = 0; 754161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_StateLoaded != m_state) { 75428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\ 754361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_state); 75448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Playback Ended - FAILED"); 754561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 75468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Playback Ended - PASSED"); 7547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if the output buffers have to be cleaned up*/ 755061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 75518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Freeing the Output Memory"); 755261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) { 7553fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan if (BITMASK_PRESENT(&m_out_bm_count, i)) { 7554fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan BITMASK_CLEAR(&m_out_bm_count, i); 7555fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan client_buffers.free_output_buffer (&m_out_mem_ptr[i]); 7556fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan } 7557fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan 7558fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan if (release_output_done()) { 7559fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan break; 7560fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan } 7561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 756261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ICS_ 756361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 756461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif 7565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev /*Check if the input buffers have to be cleaned up*/ 756861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr || m_inp_heap_ptr) { 75698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Freeing the Input Memory"); 757061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) { 7571fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan 7572fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan if (BITMASK_PRESENT(&m_inp_bm_count, i)) { 7573fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan BITMASK_CLEAR(&m_inp_bm_count, i); 7574fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan if (m_inp_mem_ptr) 7575fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan free_input_buffer (i,&m_inp_mem_ptr[i]); 7576fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan else 7577fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan free_input_buffer (i,NULL); 7578fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan } 7579fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan 7580fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan if (release_input_done()) { 7581fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan break; 7582fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan } 7583fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan } 7584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_input_buffer_header(); 7586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free_output_buffer_header(); 758761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer) { 7588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(h264_scratch.pBuffer); 7589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev h264_scratch.pBuffer = NULL; 7590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 759261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_parser) { 7593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev delete h264_parser; 759461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser = NULL; 7595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7597aa66d36cb6948770d28b7583681649c9d8826bd9Praveen Chavan if (m_frame_parser.mutils) { 75988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free utils parser"); 7599aa66d36cb6948770d28b7583681649c9d8826bd9Praveen Chavan delete (m_frame_parser.mutils); 7600aa66d36cb6948770d28b7583681649c9d8826bd9Praveen Chavan m_frame_parser.mutils = NULL; 7601aa66d36cb6948770d28b7583681649c9d8826bd9Praveen Chavan } 7602aa66d36cb6948770d28b7583681649c9d8826bd9Praveen Chavan 760361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_platform_list) { 7604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_platform_list); 7605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_platform_list = NULL; 7606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 760761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_vendor_config.pData) { 7608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev free(m_vendor_config.pData); 7609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vendor_config.pData = NULL; 7610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // Reset counters in mesg queues 7613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_size=0; 7614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.m_size=0; 7615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.m_size=0; 7616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_ftb_q.m_read = m_ftb_q.m_write =0; 7617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cmd_q.m_read = m_cmd_q.m_write =0; 7618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_etb_q.m_read = m_etb_q.m_write =0; 7619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ 762061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 762161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.reset_ts_list(); 7622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 76258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG"); 7626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 762761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // NULL); 76288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Close the driver instance"); 76296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 76308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_debug.infile) { 76318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan fclose(m_debug.infile); 76328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.infile = NULL; 76338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 76348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_debug.outfile) { 76358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan fclose(m_debug.outfile); 76368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_debug.outfile = NULL; 76378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 7638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_debug.out_ymeta_file) { 7639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fclose(m_debug.out_ymeta_file); 7640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_debug.out_ymeta_file = NULL; 7641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_debug.out_uvmeta_file) { 7643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fclose(m_debug.out_uvmeta_file); 7644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_debug.out_uvmeta_file = NULL; 7645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG 76476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal if (outputExtradataFile) 76486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal fclose (outputExtradataFile); 7649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 76508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_INFO("omx_vdec::component_deinit() complete"); 765161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 7652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 765561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 765661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::UseEGLImage 7657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 765861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 765961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Use EGL Image method implementation <TBD>. 7660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 766161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 766261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 7663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 766461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 766561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Not Implemented error. 7666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 766761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 76688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp, 766961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 767061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 port, 767161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_PTR appData, 767261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN void* eglImage) 7673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 76748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) appData; 767561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list; 767661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry; 767761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info; 7678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 768061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc; 768161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan EGLint fd = -1, offset = 0,pmemPtr = 0; 7682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else 768361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fd = -1, offset = 0; 7684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 76858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("use EGL image support for decoder"); 768661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) { 76878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid EGL image"); 768861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU 769061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_display_id == NULL) { 76918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Display ID is not set by IL client"); 7692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 769361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 769461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC) 769561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eglGetProcAddress("eglQueryImageKHR"); 76968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE, &fd); 76978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET, &offset); 7698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR, &pmemPtr); 7699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app 7700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl { 7701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int pmem_fd; 7702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev int offset; 7703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev }; 7704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct temp_egl *temp_egl_id = NULL; 7705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev void * pmemPtr = (void *) eglImage; 7706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev temp_egl_id = (struct temp_egl *)eglImage; 770761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (temp_egl_id != NULL) { 7708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev fd = temp_egl_id->pmem_fd; 7709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev offset = temp_egl_id->offset; 7710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 7712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (fd < 0) { 77138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd); 7714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorInsufficientResources; 771561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 771661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info.pmem_fd = (OMX_U32) fd; 771761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_info.offset = (OMX_U32) offset; 771861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_entry.entry = (void *) &pmem_info; 771961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 772061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list.entryList = &pmem_entry; 772161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_list.nEntries = 1; 772261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers = true; 772361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port, 772461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (void *)&pmem_list, drv_ctx.op_buf.buffer_size, 772561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (OMX_U8 *)pmemPtr)) { 77268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("use buffer call failed for egl image"); 772761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 772861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 772961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 7730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 773361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 773461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ComponentRoleEnum 7735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 773661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 773761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Component Role Enum method implementation. 7738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 773961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 774061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan <TBD>. 7741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 774261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 774361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX Error None if everything is successful. 774461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 7745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, 774661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_U8* role, 774761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_U32 index) 7748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 77498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (void) hComp; 775061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 7751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 775261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 775361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 775461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 77558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 775661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 775761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 775861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 776061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 776161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 776261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 77638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 776461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 776561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 776661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 776761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 776861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 776961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 77708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 777161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 77728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 777361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 777461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 777761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 77788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))) { 777961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 778061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 77818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 778261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 77838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 778461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 778561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 778661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 778761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 778861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 77898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 77908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 77918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 77928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = OMX_ErrorNoMore; 77938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 77948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 77958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((0 == index) && role) { 77968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan strlcpy((char *)role, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE); 77978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 7798a66301743224ed885fc1b5275acd16f4843a03f5Vineeta Srivastava } else { 77998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 78008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan eRet = OMX_ErrorNoMore; 78018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 78028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 78038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((0 == index) && role) { 78048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan strlcpy((char *)role, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE); 78058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s", role); 78068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 78078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 780861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 780961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 781061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 781161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 781261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) { 781361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 781461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 78158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 781661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 78178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 781861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 781961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 782061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 782161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((0 == index) && role) { 782261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 78238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("component_role_enum: role %s",role); 782461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 78258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("No more roles"); 782661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorNoMore; 782761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) { 7829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((0 == index) && role) { 7830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char *)role, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE); 7831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("component_role_enum: role %s",role); 7832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 7833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("No more roles"); 7834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorNoMore; 7835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 783661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 78378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component"); 783861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInvalidComponentName; 78396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 784061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 7841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 784761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 784861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateDone 7849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 785061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 785161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if entire buffer pool is allocated by IL Client or not. 785261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Need this to move to IDLE state. 7853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 785461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 785561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 7856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 785761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 785861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 7859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 786061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 7861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void) 7862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 786361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 786461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet_In = false; 786561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet_Out = false; 7866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 786761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet_In = allocate_input_done(); 786861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet_Out = allocate_output_done(); 7869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 787061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (bRet_In && bRet_Out) { 787161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 787261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 787461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 7875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 787761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 787861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateInputDone 7879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 788061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 788161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if I/P buffer pool is allocated by IL Client or not. 7882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 788361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 788461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 7885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 788661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 788761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 7888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 788961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 7890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void) 7891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 789261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 789361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0; 789461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 789561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr == NULL) { 789661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 789761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 789861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr ) { 789961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; i<drv_ctx.ip_buf.actualcount; i++) { 790061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 790161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 790261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 790361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 790461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 790561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i == drv_ctx.ip_buf.actualcount) { 790661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 790761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Allocate done for all i/p buffers"); 790861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 790961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) { 791061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_bPopulated = OMX_TRUE; 791161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 791261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 7913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 791561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 791661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::AllocateOutputDone 7917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 791861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 791961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if entire O/P buffer pool is allocated by IL Client or not. 7920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 792161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 792261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 7923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 792461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 792561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false. 7926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 792761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 7928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void) 7929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 793061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 793161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned j=0; 7932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 793361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr == NULL) { 793461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 793561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 793761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 793861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j < drv_ctx.op_buf.actualcount; j++) { 793961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_ABSENT(&m_out_bm_count,j)) { 794061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 794161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 794261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 7944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 794561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j == drv_ctx.op_buf.actualcount) { 794661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 794761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Allocate done for all o/p buffers"); 794861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_bEnabled) 794961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bPopulated = OMX_TRUE; 795061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 795261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 7953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 795661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 795761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseDone 7958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 795961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 796061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 7961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 796261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 796361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 7964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 796561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 796661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 7967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 796861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 7969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void) 7970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 797161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 7972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 797361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_input_done()) { 797461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (release_output_done()) { 797561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 797661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 7977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 797861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 7979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 7980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 7982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 798361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 798461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseOutputDone 7985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 798661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 798761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 7988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 798961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 799061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 7991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 799261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 799361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 7994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 799561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 7996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void) 7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 799861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 799961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0,j=0; 800061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 8001fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p", m_out_mem_ptr); 800261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 800361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j < drv_ctx.op_buf.actualcount ; j++) { 800461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (BITMASK_PRESENT(&m_out_bm_count,j)) { 800561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 800661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 800761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 800861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j == drv_ctx.op_buf.actualcount) { 800961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count = 0; 801061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 801161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 801261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 801361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count = 0; 801461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 8015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 801661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 8017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ====================================================================== 801961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan FUNCTION 802061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec::ReleaseInputDone 8021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 802261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DESCRIPTION 802361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan Checks if IL client has released all the buffers. 8024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 802561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PARAMETERS 802661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan None. 8027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 802861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan RETURN VALUE 802961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan true/false 8030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 803161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ========================================================================== */ 8032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void) 8033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 803461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool bRet = false; 803561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i=0,j=0; 803661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 80378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr); 803861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) { 803961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; j<drv_ctx.ip_buf.actualcount; j++) { 804061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( BITMASK_PRESENT(&m_inp_bm_count,j)) { 804161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 804261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 804361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 804461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (j==drv_ctx.ip_buf.actualcount) { 804561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 804661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 804761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 804861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bRet = true; 8049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 805061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bRet; 8051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp, 805461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE * buffer) 8055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 805661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL; 80578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!buffer || (buffer - m_out_mem_ptr) >= (int)drv_ctx.op_buf.actualcount) { 80588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer); 805961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 806061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (output_flush_progress) { 806161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer); 806261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 806361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp = 0; 806461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 806561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 806661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 806761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 806861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 806961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_extradata) { 807061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { 80718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("***************************************************"); 80728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received"); 80738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("***************************************************"); 807461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 807561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 807661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) { 80778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("***************************************************"); 80788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received"); 80798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("***************************************************"); 808061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 808261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 808361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 8084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, flags: 0x%x, timestamp: %lld", 8085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer, buffer->pBuffer, buffer->nFlags, buffer->nTimeStamp); 808661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_output_buffers --; 808761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 808861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 80898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Output EOS has been reached"); 809061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!output_flush_progress) 809161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan post_event((unsigned)NULL, (unsigned)NULL, 809261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EOS_DONE); 809361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 809461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame) { 809561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame); 809661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 809761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 809861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 809961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 81008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_input_free_q.insert_entry((unsigned long) pdest_frame,(unsigned)NULL, 810161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL); 810261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 810361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 81068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!output_flush_progress && (buffer->nFilledLen > 0)) { 8107939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan // set the default colorspace advised by client, since the bitstream may be 8108939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan // devoid of colorspace-info. 8109939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan if (m_enable_android_native_buffers) { 8110939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan ColorSpace_t color_space = ITU_R_601; 8111939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan 8112939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan // Disabled ? 8113939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan // WA for VP8. Vp8 encoder does not embed color-info (yet!). 8114939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan // Encoding RGBA results in 601-LR for all resolutions. 8115939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan // This conflicts with the client't defaults which are based on resolution. 8116939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan // Eg: 720p will be encoded as 601-LR. Client will say 709. 8117939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan // Re-enable this code once vp8 encoder generates color-info and hence the 8118939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan // decoder will be able to override with the correct source color. 8119939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan#if 0 8120939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan switch (m_client_color_space.sAspects.mPrimaries) { 8121939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan case ColorAspects::PrimariesBT601_6_625: 8122939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan case ColorAspects::PrimariesBT601_6_525: 8123939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan { 8124939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan color_space = m_client_color_space.sAspects.mRange == ColorAspects::RangeFull ? 8125939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan ITU_R_601_FR : ITU_R_601; 8126939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan break; 8127939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan } 8128939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan case ColorAspects::PrimariesBT709_5: 8129939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan { 8130939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan color_space = ITU_R_709; 8131939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan break; 8132939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan } 8133939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan default: 8134939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan { 8135939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan break; 8136939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan } 8137939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan } 8138939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan#endif 8139939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan DEBUG_PRINT_LOW("setMetaData for Color Space (client) = 0x%x (601=%u FR=%u 709=%u)", 8140939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan color_space, ITU_R_601, ITU_R_601_FR, ITU_R_709); 8141939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan set_colorspace_in_handle(color_space, buffer - m_out_mem_ptr); 8142939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan } 81438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Processing extradata"); 81448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan handle_extradata(buffer); 814561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8147f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef OUTPUT_EXTRADATA_LOG 8148f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (outputExtradataFile) { 8149f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan int buf_index = buffer - m_out_mem_ptr; 8150f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr); 8151f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 8152f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_OTHER_EXTRADATATYPE *p_extra = NULL; 8153f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) 8154f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ((unsigned long)(pBuffer + buffer->nOffset + buffer->nFilledLen + 3)&(~3)); 8155f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 8156f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan while (p_extra && (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) ) { 8157f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%x", 8158f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan p_extra->nSize, p_extra->eType); 8159f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fwrite (p_extra,1,p_extra->nSize,outputExtradataFile); 8160f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 8161f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (p_extra->eType == OMX_ExtraDataNone) { 8162f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 8163f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 8164f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 8165f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 8166f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 8167f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif 8168f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 816961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* For use buffer we need to copy the data */ 817061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!output_flush_progress) { 817161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* This is the error check for non-recoverable errros */ 817261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool is_duplicate_ts_valid = true; 817361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool is_interlaced = (drv_ctx.interlace != VDEC_InterlaceFrameProgressive); 817461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 817561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (output_capability == V4L2_PIX_FMT_MPEG4 || 817661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability == V4L2_PIX_FMT_MPEG2 || 817761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability == V4L2_PIX_FMT_DIVX || 817861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_capability == V4L2_PIX_FMT_DIVX_311) 817961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan is_duplicate_ts_valid = false; 818061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 81818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((output_capability == V4L2_PIX_FMT_H264 || 81828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan output_capability == V4L2_PIX_FMT_H264_MVC) && 81838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan is_interlaced) { 81848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF) { 818561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan is_interlaced = false; 818661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 818761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 818861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 818961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFilledLen > 0) { 819061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan time_stamp_dts.get_next_timestamp(buffer, 819161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan is_interlaced && is_duplicate_ts_valid); 819261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_debug_timestamp) { 819361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { 819461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_TICKS expected_ts = 0; 819561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.pop_min_ts(expected_ts); 819661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (is_interlaced && is_duplicate_ts_valid) { 819761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_timestamp_list.pop_min_ts(expected_ts); 819861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 81998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list", 820061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp, expected_ts); 820161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 820261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nTimeStamp != expected_ts) { 82038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check"); 820461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 820561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 820661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8207f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 82086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 8209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 821061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_cb.FillBufferDone) { 821161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFilledLen > 0) { 82128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (arbitrary_bytes) 8213073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava adjust_timestamp(buffer->nTimeStamp); 82148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan else 82158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan set_frame_rate(buffer->nTimeStamp); 82168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 821761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (perf_flag) { 821861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!proc_frms) { 821961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.stop(); 822061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan latency = dec_time.processing_time_us() - latency; 822161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3); 822261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan dec_time.start(); 822361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fps_metrics.start(); 822461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 822561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms++; 822661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 822761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U64 proc_time = 0; 822861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fps_metrics.stop(); 822961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_time = fps_metrics.processing_time_us(); 82308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%u) proc_time(%.2f)S fps(%.2f)", 82318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)proc_frms, (float)proc_time / 1e6, 8232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev (float)(1e6 * proc_frms) / proc_time); 823361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan proc_frms = 0; 823461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 823561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 823661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 823761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 823861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = LLONG_MAX; 823961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 824061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 824161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 824261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 824361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((OMX_QCOM_PLATFORM_PRIVATE_LIST *) 824461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->pPlatformPrivate)->entryList->entry; 82458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %lu",pPMEMInfo->pmem_fd); 824661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *il_buffer; 824761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan il_buffer = client_buffers.get_il_buf_hdr(buffer); 8248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 current_framerate = (int)(drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator); 82498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 82508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (il_buffer && m_last_rendered_TS >= 0) { 82518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_TICKS ts_delta = (OMX_TICKS)llabs(il_buffer->nTimeStamp - m_last_rendered_TS); 82528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 82538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan // Current frame can be send for rendering if 82548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan // (a) current FPS is <= 60 82558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan // (b) is the next frame after the frame with TS 0 82568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan // (c) is the first frame after seek 82578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan // (d) the delta TS b\w two consecutive frames is > 16 ms 82588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan // (e) its TS is equal to previous frame TS 82598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan // (f) if marked EOS 82608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 82618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if(current_framerate <= 60 || m_last_rendered_TS == 0 || 82628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan il_buffer->nTimeStamp == 0 || ts_delta >= 16000 || 82638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ts_delta == 0 || (il_buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 82648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_last_rendered_TS = il_buffer->nTimeStamp; 82658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 82668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan //mark for droping 82678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan buffer->nFilledLen = 0; 82688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 82698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 82708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" -- %s Frame -- info:: fps(%d) lastRenderTime(%lld) bufferTs(%lld) ts_delta(%lld)", 82718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan buffer->nFilledLen? "Rendering":"Dropping",current_framerate,m_last_rendered_TS, 82728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan il_buffer->nTimeStamp,ts_delta); 8273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 8274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //above code makes sure that delta b\w two consecutive frames is not 8275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //greater than 16ms, slow-mo feature, so cap fps to max 60 8276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (current_framerate > 60 ) { 8277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin current_framerate = 60; 8278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 8279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 8280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 8281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // add current framerate to gralloc meta data 8282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_enable_android_native_buffers && m_out_mem_ptr) { 8283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 buf_index = buffer - m_out_mem_ptr; 8284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 8285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin UPDATE_REFRESH_RATE, (void*)¤t_framerate); 82868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 82878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 82888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (il_buffer) { 82898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan log_output_buffers(il_buffer); 82908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (dynamic_buf_mode) { 82918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned int nPortIndex = 0; 82928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 82938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 8294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Since we're passing around handles, adjust nFilledLen and nAllocLen 8295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // to size of the handle. Do it _after_ log_output_buffers which 8296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // requires the respective sizes to be accurate. 8297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 8298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->nAllocLen = sizeof(struct VideoDecoderOutputMetaData); 8299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->nFilledLen = buffer->nFilledLen ? 8300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(struct VideoDecoderOutputMetaData) : 0; 83018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 83028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan //Clear graphic buffer handles in dynamic mode 8303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (nPortIndex < drv_ctx.op_buf.actualcount && 8304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) { 8305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin native_buffer[nPortIndex].privatehandle = NULL; 8306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin native_buffer[nPortIndex].nativehandle = NULL; 8307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 8308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("[FBD]Invalid native_buffer index: %d", nPortIndex); 8309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 8310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 83118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 831261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.FillBufferDone (hComp,m_app_data,il_buffer); 83138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 831461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr"); 831561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 831661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 83178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd); 831861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 831961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 8320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 83228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef ADAPTIVE_PLAYBACK_SUPPORTED 8323f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (m_smoothstreaming_mode && m_out_mem_ptr) { 832450ad2f6e2dc3f0fca5f2b9a5d1e2f7b056133036Praveen Chavan OMX_U32 buf_index = buffer - m_out_mem_ptr; 832550ad2f6e2dc3f0fca5f2b9a5d1e2f7b056133036Praveen Chavan BufferDim_t dim; 8326f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan private_handle_t *private_handle = NULL; 8327f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan dim.sliceWidth = framesize.nWidth; 8328f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan dim.sliceHeight = framesize.nHeight; 8329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buf_index < drv_ctx.op_buf.actualcount && 8330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS && 8331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin native_buffer[buf_index].privatehandle) 8332f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan private_handle = native_buffer[buf_index].privatehandle; 8333099ba28f1f5f8a916fb20c0d097c891fd8fa02b2Praveen Chavan if (private_handle) { 83348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set metadata: update buf-geometry with stride %d slice %d", 83358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan dim.sliceWidth, dim.sliceHeight); 8336099ba28f1f5f8a916fb20c0d097c891fd8fa02b2Praveen Chavan setMetaData(private_handle, UPDATE_BUFFER_GEOMETRY, (void*)&dim); 8337099ba28f1f5f8a916fb20c0d097c891fd8fa02b2Praveen Chavan } 8338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 83398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif 834050ad2f6e2dc3f0fca5f2b9a5d1e2f7b056133036Praveen Chavan 834161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 8342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp, 834561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* buffer) 8346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 8347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int nBufferIndex = buffer - m_inp_mem_ptr; 8349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 8350ee06e61ff49357884de5c6714828c263966895eePraveen Chavan if (buffer == NULL || (nBufferIndex >= (int)drv_ctx.ip_buf.actualcount)) { 83518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer); 835261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 8353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, bufhdr->nFlags = 0x%x", 8356f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan buffer, buffer->pBuffer, buffer->nFlags); 8357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pending_input_buffers--; 8358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 835961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 836061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL && input_flush_progress == false) { 83618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer); 836261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = buffer; 836361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 836461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nTimeStamp = LLONG_MAX; 836561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan push_input_buffer (hComp); 836661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 83678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer); 836861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer->nFilledLen = 0; 83698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!m_input_free_q.insert_entry((unsigned long)buffer, 837061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL, (unsigned)NULL)) { 83718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error"); 837261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 837461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (m_cb.EmptyBufferDone) { 8375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer->nFilledLen = 0; 837661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (input_use_buffer == true) { 8377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr]; 8378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 8380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Restore the FD that we over-wrote in ETB */ 8381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_input_pass_buffer_fd) { 8382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->pBuffer = (OMX_U8*)(uintptr_t)drv_ctx.ptr_inputbuffer[nBufferIndex].pmem_fd; 8383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 8384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 8385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_cb.EmptyBufferDone(hComp ,m_app_data, buffer); 8386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 8388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message) 8391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 839261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_vdec* omx = NULL; 839361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_msginfo *vdec_msg = NULL; 839461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omxhdr = NULL; 839561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_buffer *v4l2_buf_ptr = NULL; 839661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_output_frameinfo *output_respbuf = NULL; 839761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc=1; 839861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (context == NULL || message == NULL) { 83998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check"); 840061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -1; 840161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 840261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg = (struct vdec_msginfo *)message; 840361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 840461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = reinterpret_cast<omx_vdec*>(context); 840561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 840661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (vdec_msg->msgcode) { 840761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 840861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_HW_ERROR: 840961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 841061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 841161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 841261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 8413f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan case VDEC_MSG_EVT_HW_OVERLOAD: 8414f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 8415f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD); 8416f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 8417f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 8418f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan case VDEC_MSG_EVT_HW_UNSUPPORTED: 8419f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 8420f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING); 8421f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 8422f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 842361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_START_DONE: 842461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 842561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_START_DONE); 842661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 842761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 842861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_STOP_DONE: 842961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 843061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_STOP_DONE); 843161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 843261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 843361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_RESUME_DONE: 843461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 843561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_RESUME_DONE); 843661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 843761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 843861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_PAUSE_DONE: 843961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 844061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PAUSE_DONE); 844161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 844261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 844361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_INPUT_DONE: 844461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 844561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH); 844661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 844761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE: 844861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 844961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH); 845061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 845161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_FLUSHED: 845261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_INPUT_BUFFER_DONE: 845361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 845461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* omxhdr = (OMX_BUFFERHEADERTYPE* ) 845561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.input_frame_clientdata; */ 845661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 845761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata; 8458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omx->m_inp_mem_ptr == NULL || v4l2_buf_ptr == NULL || 8459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf_ptr->index >= omx->drv_ctx.ip_buf.actualcount) { 846061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr = NULL; 846161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->status_code = VDEC_S_EFATAL; 8462f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan break; 8463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 846461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr = omx->m_inp_mem_ptr + v4l2_buf_ptr->index; 8466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 846761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED) { 846861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Unsupported input"); 8469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 8470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 847161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 847261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) { 8473f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 847461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR; 847561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8476f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (omxhdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 8477f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 8478f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("Decrement codec_config buffer counter"); 8479f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan android_atomic_dec(&omx->m_queued_codec_config_count); 8480f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if ((android_atomic_add(0, &omx->m_queued_codec_config_count) == 0) && 8481f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan BITMASK_PRESENT(&omx->m_flags, OMX_COMPONENT_FLUSH_DEFERRED)) { 8482f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("sem post for CODEC CONFIG buffer"); 8483f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan sem_post(&omx->m_safe_flush); 8484f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 8485f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 8486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || 8487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) { 8488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME; 8489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 84908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan omx->post_event ((unsigned long)omxhdr,vdec_msg->status_code, 849161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EBD); 849261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 849361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_INFO_FIELD_DROPPED: 849461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int64_t *timestamp; 849561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan timestamp = (int64_t *) malloc(sizeof(int64_t)); 849661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (timestamp) { 849761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *timestamp = vdec_msg->msgdata.output_frame.time_stamp; 84988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan omx->post_event ((unsigned long)timestamp, vdec_msg->status_code, 849961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED); 85008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Field dropped time stamp is %lld", 8501f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (long long)vdec_msg->msgdata.output_frame.time_stamp); 850261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 850361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 850461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_FLUSHED: 850561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE: 850661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 8507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data; 8508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 8509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (v4l2_buf_ptr == NULL || omx->m_out_mem_ptr == NULL || 8510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf_ptr->index >= omx->drv_ctx.op_buf.actualcount) { 8511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr = NULL; 8512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg->status_code = VDEC_S_EFATAL; 8513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 8514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 8515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 8516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr = omx->m_out_mem_ptr + v4l2_buf_ptr->index; 8517f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 8518f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) PicType(%u) Flags (0x%x) FillLen(%u) Crop: L(%u) T(%u) R(%u) B(%u)", 8519f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omxhdr, (long long)vdec_msg->msgdata.output_frame.time_stamp, 8520f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg->msgdata.output_frame.pic_type, v4l2_buf_ptr->flags, 8521f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)vdec_msg->msgdata.output_frame.len, 8522f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg->msgdata.output_frame.framesize.left, 8523f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg->msgdata.output_frame.framesize.top, 8524f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg->msgdata.output_frame.framesize.right, 8525f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg->msgdata.output_frame.framesize.bottom); 852661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 852761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr && omxhdr->pOutputPortPrivate && 85288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ((omxhdr - omx->m_out_mem_ptr) < (int)omx->drv_ctx.op_buf.actualcount) && 852961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate 85308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan - omx->drv_ctx.ptr_respbuffer) < (int)omx->drv_ctx.op_buf.actualcount)) { 8531f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 8532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) { 853361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len; 853461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset; 853561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp; 853661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags = 0; 853761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 85388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) { 853961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= OMX_BUFFERFLAG_EOS; 854061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //rc = -1; 854161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 854261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr->nFilledLen) { 854361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME; 854461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 854561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) { 854661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME; 854761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 854861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME; 854961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8550f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) { 8551f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 8552f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 855361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) { 855461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY; 855561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8556576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 85578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_MSM_BUF_FLAG_MBAFF) { 85588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_MBAFF; 85598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 85608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 8561576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_READONLY) { 85628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan omxhdr->nFlags |= OMX_BUFFERFLAG_READONLY; 8563576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon DEBUG_PRINT_LOW("F_B_D: READONLY BUFFER - REFERENCE WITH F/W fd = %d", 8564576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd); 8565576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 8566576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 856761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) && 8568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !omx->output_flush_progress && 856961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) && 85708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS)) { 8571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index = v4l2_buf_ptr->index; 8572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int extra_idx = EXTRADATA_IDX(omx->drv_ctx.num_planes); 8573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_plane *plane = v4l2_buf_ptr->m.planes; 85748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan omx->time_stamp_dts.remove_time_stamp( 85758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan omxhdr->nTimeStamp, 85768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (omx->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 85778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ?true:false); 8578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].bytesused = 0; 8579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].m.userptr = 8580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long)omx->drv_ctx.ptr_outputbuffer[index].bufferaddr - 8581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long)omx->drv_ctx.ptr_outputbuffer[index].offset; 8582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].reserved[0] = omx->drv_ctx.ptr_outputbuffer[index].pmem_fd; 8583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].reserved[1] = omx->drv_ctx.ptr_outputbuffer[index].offset; 8584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].data_offset = 0; 8585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf_ptr->flags = 0x0; 8586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 8587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].bytesused = 0; 8588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].length = omx->drv_ctx.extradata_info.buffer_size; 8589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].m.userptr = (long unsigned int) (omx->drv_ctx.extradata_info.uaddr + index * omx->drv_ctx.extradata_info.buffer_size); 8590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 8591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].reserved[0] = omx->drv_ctx.extradata_info.ion.fd_ion_data.fd; 8592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 8593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].reserved[1] = v4l2_buf_ptr->index * omx->drv_ctx.extradata_info.buffer_size; 8594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].data_offset = 0; 8595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (extra_idx >= VIDEO_MAX_PLANES) { 8596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx); 8597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return -1; 8598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 8599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 8600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("SENDING FTB TO F/W from async_message_process - fd[0] = %d fd[1] = %d offset[1] = %d in_flush = %d", 8601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], omx->output_flush_progress); 8602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_QBUF, v4l2_buf_ptr)) { 8603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to queue buffer back to driver: %d, %d, %d", v4l2_buf_ptr->length, v4l2_buf_ptr->m.planes[0].reserved[0], v4l2_buf_ptr->m.planes[1].reserved[0]); 8604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return -1; 8605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 860661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 860761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 860861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) { 860961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 861061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 861161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.bufferaddr = 861261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr; 8613f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 8614f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* Post event if resolution OR crop changed */ 8615f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* filled length will be changed if resolution changed */ 8616f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan /* Crop parameters can be changed even without resolution change */ 8617f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (omxhdr->nFilledLen 8618f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan && ((omx->prev_n_filled_len != omxhdr->nFilledLen) 8619f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan || (omx->drv_ctx.frame_size.left != vdec_msg->msgdata.output_frame.framesize.left) 8620f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan || (omx->drv_ctx.frame_size.top != vdec_msg->msgdata.output_frame.framesize.top) 8621f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan || (omx->drv_ctx.frame_size.right != vdec_msg->msgdata.output_frame.framesize.right) 8622f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan || (omx->drv_ctx.frame_size.bottom != vdec_msg->msgdata.output_frame.framesize.bottom) 8623f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan || (omx->drv_ctx.video_resolution.frame_width != vdec_msg->msgdata.output_frame.picsize.frame_width) 8624f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan || (omx->drv_ctx.video_resolution.frame_height != vdec_msg->msgdata.output_frame.picsize.frame_height) )) { 8625f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 8626f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Paramters Changed From: Len: %u, WxH: %dx%d, L: %u, T: %u, R: %u, B: %u --> Len: %u, WxH: %dx%d, L: %u, T: %u, R: %u, B: %u", 8627f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omx->prev_n_filled_len, 8628f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omx->drv_ctx.video_resolution.frame_width, 8629f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omx->drv_ctx.video_resolution.frame_height, 8630f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omx->drv_ctx.frame_size.left, omx->drv_ctx.frame_size.top, 8631f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omx->drv_ctx.frame_size.right, omx->drv_ctx.frame_size.bottom, 8632f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omxhdr->nFilledLen, vdec_msg->msgdata.output_frame.picsize.frame_width, 8633f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg->msgdata.output_frame.picsize.frame_height, 8634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg->msgdata.output_frame.framesize.left, 8635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg->msgdata.output_frame.framesize.top, 8636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg->msgdata.output_frame.framesize.right, 8637f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg->msgdata.output_frame.framesize.bottom); 8638f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 8639f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omx->drv_ctx.video_resolution.frame_width = 8640f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg->msgdata.output_frame.picsize.frame_width; 8641f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omx->drv_ctx.video_resolution.frame_height = 8642f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan vdec_msg->msgdata.output_frame.picsize.frame_height; 8643f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) { 8644f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omx->drv_ctx.video_resolution.stride = 8645f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan VENUS_Y_STRIDE(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_width); 8646f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omx->drv_ctx.video_resolution.scan_lines = 8647f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan VENUS_Y_SCANLINES(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_height); 8648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) { 8649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->drv_ctx.video_resolution.stride = 8650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_width); 8651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->drv_ctx.video_resolution.scan_lines = 8652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_height); 8653f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 8654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 8655f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memcpy(&omx->drv_ctx.frame_size, 8656f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan &vdec_msg->msgdata.output_frame.framesize, 8657f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan sizeof(struct vdec_framesize)); 8658f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 8659f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omx->post_event(OMX_CORE_OUTPUT_PORT_INDEX, 8660f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_IndexConfigCommonOutputCrop, 8661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_PORT_RECONFIG); 8662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 8663f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 866461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omxhdr->nFilledLen) 866561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->prev_n_filled_len = omxhdr->nFilledLen; 866661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 866761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf = (struct vdec_output_frameinfo *)\ 866861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->pOutputPortPrivate; 8669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!output_respbuf) { 8670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("async_message_process: invalid output buf received"); 8671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return -1; 8672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 867361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->len = vdec_msg->msgdata.output_frame.len; 867461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->offset = vdec_msg->msgdata.output_frame.offset; 8675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 867661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) { 867761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_I; 867861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 867961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) { 868061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_P; 868161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 868261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) { 868361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_respbuf->pic_type = PICTURE_TYPE_B; 868461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omxhdr && omxhdr->nFilledLen) { 8686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->request_perf_level(VIDC_NOMINAL); 8687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 86880c95c078771f637924fa7ae01b0d90df285dde64Ray Essick if (omx->output_use_buffer && omxhdr->pBuffer && 8689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdec_msg->msgdata.output_frame.bufferaddr) 869061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ( omxhdr->pBuffer, (void *) 869161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr + 869261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned long)vdec_msg->msgdata.output_frame.offset), 869361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan vdec_msg->msgdata.output_frame.len); 8694f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 8695f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Invalid filled length = %u, buffer size = %u, prev_length = %u", 8696f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)vdec_msg->msgdata.output_frame.len, 8697f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan omxhdr->nAllocLen, omx->prev_n_filled_len); 869861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omxhdr->nFilledLen = 0; 8699f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 8700f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 87018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan omx->post_event ((unsigned long)omxhdr, vdec_msg->status_code, 870261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_FBD); 8703f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 8704f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) { 87058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan omx->post_event ((unsigned long)NULL, vdec_msg->status_code, 870661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_EOS_DONE); 8707f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 870861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event ((unsigned int)NULL, vdec_msg->status_code, 870961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 8710f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 871161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 871261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case VDEC_MSG_EVT_CONFIG_CHANGED: 87138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Port settings changed"); 8714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->m_reconfig_width = vdec_msg->msgdata.output_frame.picsize.frame_width; 8715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->m_reconfig_height = vdec_msg->msgdata.output_frame.picsize.frame_height; 871661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition, 871761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COMPONENT_GENERATE_PORT_RECONFIG); 8718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->request_perf_level(VIDC_NOMINAL); 871961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 872061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 872161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 872261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 872361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 8724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary ( 872761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_HANDLETYPE hComp, 872861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *buffer 872961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ) 8730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 873161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned address,p2,id; 87328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Empty this arbitrary"); 873361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 873461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer == NULL) { 873561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 873661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 87378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 87388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %u, timestamp %lld", 87398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)buffer->nFilledLen, (unsigned int)buffer->nFlags, buffer->nTimeStamp); 874061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 874161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return zero length and not an EOS buffer */ 874261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* return buffer if input flush in progress */ 874361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) && 874461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) { 87458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress"); 874661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,buffer); 874761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 874861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 874961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 875061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame == NULL) { 87518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp); 875261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = buffer; 87538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Try to Push One Input Buffer "); 875461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan push_input_buffer (hComp); 875561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 87568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer); 87578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!m_input_pending_q.insert_entry((unsigned long)buffer, (unsigned)NULL, 875861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL)) { 875961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 876061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8763f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 8764f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan codec_config_flag = false; 8765f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 876661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 8767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp) 8770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 87718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long address,p2,id; 877261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 877361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 877461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL || psource_frame == NULL) { 877561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we have a destination buffer*/ 877661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame == NULL) { 87778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Get a Destination buffer from the queue"); 877861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 877961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 878061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *)address; 878161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 878261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 87838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame); 878461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 878561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 878761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if we have a destination buffer*/ 878861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame == NULL) { 87898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Get a source buffer from the queue"); 879061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 879161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 879261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *)address; 87938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame, 879461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nTimeStamp); 87958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %u length %u", 87968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen); 8797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 879861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 879961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 880161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 880361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while ((pdest_frame != NULL) && (psource_frame != NULL)) { 880461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (codec_type_parse) { 880561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_MPEG4: 880661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_H263: 880761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_MPEG2: 880861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_sc_codec(hComp); 880961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 881061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_H264: 881161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_h264(hComp); 881261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 88138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case CODEC_TYPE_HEVC: 88148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ret = push_input_hevc(hComp); 88158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 881661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case CODEC_TYPE_VC1: 881761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = push_input_vc1(hComp); 881861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 881961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 882061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 882161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 882261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret != OMX_ErrorNone) { 88238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Pushing input Buffer Failed"); 882461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 882561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 882661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 882961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 8830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp) 8833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 883461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 883561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 88368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long address = 0, p2 = 0, id = 0; 8837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 88388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %lld", 883961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame,psource_frame->nTimeStamp); 884061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 884161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame,&partial_frame) == -1) { 88428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 884361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 8844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 884561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 884661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 88478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Frame size %u source %p frame count %d", 88488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)pdest_frame->nFilledLen,psource_frame,frame_count); 884961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 885061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 88518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("TimeStamp updated %lld", pdest_frame->nTimeStamp); 885261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*First Parsed buffer will have only header Hence skip*/ 885361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frame_count == 0) { 88548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame "); 885561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 885661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_MPEG4 || 885761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan codec_type_parse == CODEC_TYPE_DIVX) { 885861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4StreamType psBits; 885961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset; 886061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psBits.numBytes = pdest_frame->nFilledLen; 886161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mp4_headerparser.parseHeader(&psBits); 886261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 886361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 886461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 886561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 886661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 886761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen) { 886861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 886961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 887061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 887161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 887261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 887361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 887461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 887561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 887661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 887761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 887861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 887961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 888061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) { 88818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Zero len buffer return back to POOL"); 88828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned)NULL, 888361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (unsigned)NULL); 888461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 888561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 888661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 888761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 88888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a Complete Frame %u", (unsigned int)pdest_frame->nFilledLen); 888961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 889061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nAllocLen == 889161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen + pdest_frame->nOffset) { 88928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled"); 889361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 889461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 889761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen == 0) { 889861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 889961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 890061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags |= psource_frame->nFlags; 89018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %lld", 89028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 89038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Found a frame size = %u number = %d", 89048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)pdest_frame->nFilledLen,frame_count++); 890561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 890661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 890761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 890861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 890961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 891061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 891161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 89128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Last frame in else dest addr") ; 891361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 891461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 891561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 891661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd) { 89178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame); 891861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 891961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 892061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 892161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 89228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame); 892361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 892461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 89258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame, 892661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame->nTimeStamp); 89278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %u length %u", 89288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen); 892961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 893061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 893161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 893261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 8933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 8934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 8935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp) 8936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 893761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 partial_frame = 1; 89388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long address = 0, p2 = 0, id = 0; 893961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL isNewFrame = OMX_FALSE; 894061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 894161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 894261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.pBuffer == NULL) { 89438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated"); 894461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 8945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 89468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %u " 89478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "look_ahead_nal %d", (unsigned int)h264_scratch.nFilledLen, look_ahead_nal); 89488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %u",(unsigned int)pdest_frame->nFilledLen); 894961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen && look_ahead_nal) { 895061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 895161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 895261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 895361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 895461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 895561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 89568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame"); 895761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 895861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 89598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264"); 896061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 896161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 896329caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan 896429caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan /* If an empty input is queued with EOS, do not coalesce with the destination-frame yet, as this may result 896529caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan in EOS flag getting associated with the destination 896629caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan */ 896729caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan if (!psource_frame->nFilledLen && (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) && 896829caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan pdest_frame->nFilledLen) { 896929caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan DEBUG_PRINT_HIGH("delay ETB for 'empty buffer with EOS'"); 897029caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan generate_ebd = OMX_FALSE; 897129caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan } 897229caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan 897361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_length == 0) { 89748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Zero NAL, hence parse using start code"); 897561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 897661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 89778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 897861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 897961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 898061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 89818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length); 898261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.parse_h264_nallength(psource_frame, 898361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &h264_scratch,&partial_frame) == -1) { 89848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error"); 898561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 898661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 8987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 8988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 898961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (partial_frame == 0) { 899061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 89918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip"); 899261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 899361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 899461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFlags = psource_frame->nFlags; 899561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 89968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Parsed New NAL Length = %u",(unsigned int)h264_scratch.nFilledLen); 899761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nFilledLen) { 899861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen, 899961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan NALU_TYPE_SPS); 9000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 900161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) 900261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 900361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, NALU_TYPE_SEI); 900461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 900561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // If timeinfo is present frame info from SEI is already processed 900661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 900761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen, NALU_TYPE_SEI); 9008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 900961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame); 901061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_count++; 901161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) { 901261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = h264_last_au_ts; 901361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = h264_last_au_flags; 9014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PANSCAN_HDLR 901561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 901661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_parser->update_panscan_data(h264_last_au_ts); 9017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 901861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 901961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR || 902061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) { 902161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = h264_scratch.nTimeStamp; 902261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_flags = h264_scratch.nFlags; 9023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 902461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 902561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts); 902661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!VALID_TS(h264_last_au_ts)) 902761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = ts_in_sei; 902861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 903061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 903161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_last_au_ts = LLONG_MAX; 903261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 903361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 903461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!isNewFrame) { 903561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 903661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 90378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %u", 90388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)h264_scratch.nFilledLen); 903961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 904061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 904161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 904261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ) 904361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 904461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 904561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 90468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264"); 904761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 904861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9049f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan } else if(h264_scratch.nFilledLen) { 905061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = true; 90518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %llu", 90528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 90538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Found a frame size = %u number = %d", 90548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)pdest_frame->nFilledLen,frame_count++); 905561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 905661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame->nFilledLen == 0) { 90578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Copy the Current Frame since and push it"); 905861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan look_ahead_nal = false; 905961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 906061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 906161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 906261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 906361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 906461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen = 0; 906561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 90668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264"); 906761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 906861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 906961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 907061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 90718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Reset the EOS Flag"); 907261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 907361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 907461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 907561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 907661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 907761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 907861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //frame_count++; 907961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 908061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_free_q.m_size) { 908161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_free_q.pop_entry(&address,&p2,&id); 908261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 90838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame); 908461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFilledLen = 0; 908561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nFlags = 0; 908661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 908761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 908861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 908961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 909161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 90928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %u", (unsigned int)pdest_frame->nFilledLen); 909361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Check if Destination Buffer is full*/ 909461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (h264_scratch.nAllocLen == 909561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen + h264_scratch.nOffset) { 90968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled"); 909761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorStreamCorrupt; 9098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 9099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 9100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 910161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!psource_frame->nFilledLen) { 91028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame); 9103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 910461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 910561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pdest_frame) { 91068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer"); 910761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 910861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan h264_scratch.nFilledLen) { 9109f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan if(pdest_frame->nFilledLen == 0) { 9110f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan /* No residual frame from before, send whatever 9111f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan * we have left */ 9112f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan memcpy((pdest_frame->pBuffer + pdest_frame->nFilledLen), 9113f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan h264_scratch.pBuffer, h264_scratch.nFilledLen); 9114f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 9115f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan h264_scratch.nFilledLen = 0; 9116f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 9117f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan } else { 9118f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame); 9119f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan if(!isNewFrame) { 9120f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan /* Have a residual frame, but we know that the 9121f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan * AU in this frame is belonging to whatever 9122f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan * frame we had left over. So append it */ 9123f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 9124f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan h264_scratch.pBuffer,h264_scratch.nFilledLen); 9125f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan pdest_frame->nFilledLen += h264_scratch.nFilledLen; 9126f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan h264_scratch.nFilledLen = 0; 9127f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (h264_last_au_ts != LLONG_MAX) 9128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pdest_frame->nTimeStamp = h264_last_au_ts; 9129f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan } else { 9130f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan /* Completely new frame, let's just push what 9131f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan * we have now. The resulting EBD would trigger 9132f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan * another push */ 9133f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan generate_ebd = OMX_FALSE; 9134f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan pdest_frame->nTimeStamp = h264_last_au_ts; 9135f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan h264_last_au_ts = h264_scratch.nTimeStamp; 9136f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan } 9137f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan } 913861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 91398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264"); 914061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 914161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9142f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan 9143f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan /* Iff we coalesced two buffers, inherit the flags of both bufs */ 9144f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan if(generate_ebd == OMX_TRUE) { 9145f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 9146f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan } 9147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 91488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%u TimeStamp = %llu", 91498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 91508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++); 9151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 915261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 915361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp); 915461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!VALID_TS(pdest_frame->nTimeStamp)) 915561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nTimeStamp = ts_in_sei; 915661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 915861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Push the frame to the Decoder*/ 915961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 916061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 916161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 916261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_count++; 916361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame = NULL; 916461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 91658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u", 91668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame, (unsigned int)h264_scratch.nFilledLen); 916761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan generate_ebd = OMX_FALSE; 916861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 916961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 917061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 917161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (generate_ebd && !psource_frame->nFilledLen) { 917261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 917361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = NULL; 917461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_input_pending_q.m_size) { 91758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame); 917661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_input_pending_q.pop_entry(&address,&p2,&id); 917761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *) address; 91788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %u src length %u", 91798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen); 91808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 91818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 91828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorNone; 91838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 91848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 91858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc) 91868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{ 91878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_ERRORTYPE rc = OMX_ErrorNone; 91888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) { 91898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan memcpy((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen); 91908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (pDst->nTimeStamp == LLONG_MAX) { 91918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pDst->nTimeStamp = pSrc->nTimeStamp; 91928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Assign Dst nTimeStamp = %lld", pDst->nTimeStamp); 91938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 91948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pDst->nFilledLen += pSrc->nFilledLen; 91958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pSrc->nFilledLen = 0; 91968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 91978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Destination buffer overflow"); 91988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan rc = OMX_ErrorBadParameter; 91998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return rc; 92018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 92028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 92038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::push_input_hevc(OMX_HANDLETYPE hComp) 92048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{ 92058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 partial_frame = 1; 92068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long address,p2,id; 92078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_BOOL isNewFrame = OMX_FALSE; 92088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_BOOL generate_ebd = OMX_TRUE; 92098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_ERRORTYPE rc = OMX_ErrorNone; 92108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (h264_scratch.pBuffer == NULL) { 92118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated"); 92128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorBadParameter; 92138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 92158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("h264_scratch.nFilledLen %u has look_ahead_nal %d \ 92168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame nFilledLen %u nTimeStamp %lld", 92178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)h264_scratch.nFilledLen, look_ahead_nal, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 92188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 92198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (h264_scratch.nFilledLen && look_ahead_nal) { 92208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan look_ahead_nal = false; 92218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 92228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (rc != OMX_ErrorNone) { 92238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return rc; 92248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 92278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (nal_length == 0) { 92288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_frame_parser.parse_sc_frame(psource_frame, 92298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan &h264_scratch,&partial_frame) == -1) { 92308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 92318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorBadParameter; 92328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 92348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length); 92358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_frame_parser.parse_h264_nallength(psource_frame, 92368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan &h264_scratch,&partial_frame) == -1) { 92378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error"); 92388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorBadParameter; 92398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 92428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (partial_frame == 0) { 92438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 92448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip"); 92458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan nal_count++; 92468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 92478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan h264_scratch.nFlags = psource_frame->nFlags; 92488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 92498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Parsed New NAL Length = %u", (unsigned int)h264_scratch.nFilledLen); 92508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (h264_scratch.nFilledLen) { 92518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_hevc_utils.isNewFrame(&h264_scratch, 0, isNewFrame); 92528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan nal_count++; 92538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 92558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!isNewFrame) { 92568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %u \ 92578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan nTimestamp %lld, pdest_frame nFilledLen %u nTimestamp %lld", 92588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp, 92598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 92608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 92618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (rc != OMX_ErrorNone) { 92628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return rc; 92638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 92658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan look_ahead_nal = true; 92668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (pdest_frame->nFilledLen == 0) { 92678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan look_ahead_nal = false; 92688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer"); 92698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 92708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (rc != OMX_ErrorNone) { 92718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorBadParameter; 92728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 92748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 92758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 92768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("FrameDetected # %d pdest_frame nFilledLen %u \ 92788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan nTimeStamp %lld, look_ahead_nal in h264_scratch \ 92798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan nFilledLen %u nTimeStamp %lld", 92808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_count++, (unsigned int)pdest_frame->nFilledLen, 92818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame->nTimeStamp, (unsigned int)h264_scratch.nFilledLen, 92828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan h264_scratch.nTimeStamp); 92838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) { 92848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorBadParameter; 92858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame = NULL; 92878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_input_free_q.m_size) { 92888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_input_free_q.pop_entry(&address, &p2, &id); 92898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 92908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("pop the next pdest_buffer %p", pdest_frame); 92918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame->nFilledLen = 0; 92928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame->nFlags = 0; 92938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame->nTimeStamp = LLONG_MAX; 92948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 92988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 92998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %u nTimeStamp %lld, \ 93008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame nFilledLen %u nTimeStamp %lld, h264_scratch \ 93018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan nFilledLen %u nTimeStamp %lld", 93028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp, 93038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp, 93048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp); 93058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 93068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (h264_scratch.nAllocLen == 93078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan h264_scratch.nFilledLen + h264_scratch.nOffset) { 93088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled"); 93098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorStreamCorrupt; 93108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 93118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 93128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 93138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!psource_frame->nFilledLen) { 93148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client", psource_frame); 93158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 93168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (pdest_frame) { 93178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer"); 93188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan rc = copy_buffer(pdest_frame, &h264_scratch); 93198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ( rc != OMX_ErrorNone ) { 93208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return rc; 93218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 93228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 93238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 93248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%u TimeStamp = %lld", 93258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_count, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 93268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) { 93278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return OMX_ErrorBadParameter; 93288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 93298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_count++; 93308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame = NULL; 93318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 93328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u", 93338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan pdest_frame, (unsigned int)h264_scratch.nFilledLen); 93348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan generate_ebd = OMX_FALSE; 93358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 93368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 93378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 93388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 93398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (generate_ebd && !psource_frame->nFilledLen) { 93408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_cb.EmptyBufferDone (hComp, m_app_data, psource_frame); 93418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan psource_frame = NULL; 93428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_input_pending_q.m_size) { 93438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_input_pending_q.pop_entry(&address, &p2, &id); 93448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan psource_frame = (OMX_BUFFERHEADERTYPE *)address; 93458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Next source Buffer flag %u nFilledLen %u, nTimeStamp %lld", 93468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp); 934761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 934861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 934961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 9350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 9351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 9352e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdec::push_input_vc1(OMX_HANDLETYPE hComp) 9353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 9354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U8 *buf, *pdest; 9355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 partial_frame = 1; 9356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_U32 buf_len, dest_len; 9357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 935861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (first_frame == 0) { 9359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev first_frame = 1; 93608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes"); 936161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_vendor_config.pData) { 93628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Check profile type in 1st source buffer"); 9363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf = psource_frame->pBuffer; 9364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev buf_len = psource_frame->nFilledLen; 9365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 9366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) == 936761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan VC1_SP_MP_START_CODE) { 9368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vc1_profile = VC1_SP_MP_RCV; 936961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) { 9370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev m_vc1_profile = VC1_AP; 937161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 93728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer"); 9373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorStreamCorrupt; 9374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 937561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 9376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen + 9377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nOffset; 9378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen + 937961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pdest_frame->nOffset); 9380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 938161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (dest_len < m_vendor_config.nDataSize) { 93828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Destination buffer full"); 9383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 938461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 9385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize); 9386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev pdest_frame->nFilledLen += m_vendor_config.nDataSize; 9387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 9388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 9389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 9390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 939161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (m_vc1_profile) { 9392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VC1_AP: 93938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code"); 939461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (push_input_sc_codec(hComp) != OMX_ErrorNone) { 93958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code"); 9396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 9397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 939861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 9399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 9400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev case VC1_SP_MP_RCV: 9401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev default: 94028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode"); 9403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorBadParameter; 9404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 9405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 9406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 9407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 94086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifndef USE_ION 94096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 941061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 alignment) 94116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 941261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct pmem_allocation allocation; 941361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.size = buffer_size; 941461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align = clip2(alignment); 941561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocation.align < 4096) { 941661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align = 4096; 941761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 941861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) { 94198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)", 942061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocation.align, allocation.size); 942161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 942261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 942361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return true; 94246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 94256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 9426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 9427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size, 942861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 alignment, struct ion_allocation_data *alloc_data, 942961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct ion_fd_data *fd_data, int flag) 9430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 943161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int fd = -EINVAL; 943261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = -EINVAL; 943361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ion_dev_flag; 943461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_ion ion_buf_info; 943561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!alloc_data || buffer_size <= 0 || !fd_data) { 94368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory"); 943761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return -EINVAL; 943861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 943961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_dev_flag = O_RDONLY; 944061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = open (MEM_DEVICE, ion_dev_flag); 944161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fd < 0) { 94428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd); 944361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return fd; 944461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 9446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin alloc_data->flags = flag; 944761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->len = buffer_size; 944861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->align = clip2(alignment); 944961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (alloc_data->align < 4096) { 945061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan alloc_data->align = 4096; 945161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 945261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 9453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID); 9454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (secure_mode && (alloc_data->flags & ION_SECURE)) { 9455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID); 9456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 9457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 9458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Use secure display cma heap for obvious reasons. */ 9459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (alloc_data->flags & ION_FLAG_CP_BITSTREAM) { 9460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin alloc_data->heap_id_mask |= ION_HEAP(ION_SECURE_DISPLAY_HEAP_ID); 9461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 9462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 946361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd,ION_IOC_ALLOC,alloc_data); 946461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc || !alloc_data->handle) { 94658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION ALLOC memory failed"); 94668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan alloc_data->handle = 0; 946761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(fd); 946861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = -ENOMEM; 946961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return fd; 947061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 947161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd_data->handle = alloc_data->handle; 947261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(fd,ION_IOC_MAP,fd_data); 947361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 94748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION MAP failed "); 947561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.ion_alloc_data = *alloc_data; 947661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.ion_device_fd = fd; 947761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ion_buf_info.fd_ion_data = *fd_data; 947861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free_ion_memory(&ion_buf_info); 947961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd_data->fd =-1; 948061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fd = -ENOMEM; 948161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 948261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 9483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return fd; 9484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 9485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 948661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) 948761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 948861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 948961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!buf_ion_info) { 94908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata"); 949161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 949261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 949361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE, 949461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &buf_ion_info->ion_alloc_data.handle)) { 94958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ION: free failed" ); 949661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 949761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(buf_ion_info->ion_device_fd); 949861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->ion_device_fd = -1; 94998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan buf_ion_info->ion_alloc_data.handle = 0; 950061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_ion_info->fd_ion_data.fd = -1; 9501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 9502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 9503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header() 9504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 95058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("ALL output buffers are freed/released"); 950661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan output_use_buffer = false; 950761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ouput_egl_buffers = false; 950861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 950961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 951061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_out_mem_ptr); 951161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 951261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 951361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 951461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_platform_list) { 951561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_platform_list); 951661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = NULL; 951761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 951861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 951961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 952061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_respbuffer); 952161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 952261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 952361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 952461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_outputbuffer); 952561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 952661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 9528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.op_buf_ion_info) { 95298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free o/p ion context"); 953061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 9531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.op_buf_ion_info = NULL; 9532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 9533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 9534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_ref_remove(); 9535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 9536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 9537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header() 9538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 9539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev input_use_buffer = false; 954061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (arbitrary_bytes) { 954161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_heap_ptr) { 95428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free input Heap Pointer"); 954361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_inp_heap_ptr); 954461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_heap_ptr = NULL; 954561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 954661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 954761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_phdr_pmem_ptr) { 95488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free input pmem header Pointer"); 954961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_phdr_pmem_ptr); 955061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_phdr_pmem_ptr = NULL; 955161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 955361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_inp_mem_ptr) { 95548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free input pmem Pointer area"); 955561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (m_inp_mem_ptr); 955661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_inp_mem_ptr = NULL; 955761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9558a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan /* We just freed all the buffer headers, every thing in m_input_free_q, 95598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan * m_input_pending_q, pdest_frame, and psource_frame is now invalid */ 956074258d54fc1c909efc0cf7ebb302e54e70067a20Praveen Chavan while (m_input_free_q.m_size) { 95618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long address, p2, id; 956274258d54fc1c909efc0cf7ebb302e54e70067a20Praveen Chavan m_input_free_q.pop_entry(&address, &p2, &id); 956374258d54fc1c909efc0cf7ebb302e54e70067a20Praveen Chavan } 9564a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan while (m_input_pending_q.m_size) { 95658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long address, p2, id; 9566a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan m_input_pending_q.pop_entry(&address, &p2, &id); 9567a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan } 9568a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan pdest_frame = NULL; 9569a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan psource_frame = NULL; 957061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_inputbuffer) { 95718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free Driver Context pointer"); 957261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free (drv_ctx.ptr_inputbuffer); 957361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_inputbuffer = NULL; 9574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 9575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 9576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (drv_ctx.ip_buf_ion_info) { 95778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free ion context"); 957861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ip_buf_ion_info); 9579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev drv_ctx.ip_buf_ion_info = NULL; 9580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 9581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 9582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 95836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 95846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::stream_off(OMX_U32 port) 9585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 958661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_buf_type btype; 958761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc = 0; 958861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enum v4l2_ports v4l2_port = OUTPUT_PORT; 958961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 959061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (port == OMX_CORE_INPUT_PORT_INDEX) { 959161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 959261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_port = OUTPUT_PORT; 959361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 959461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 959561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan v4l2_port = CAPTURE_PORT; 959661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (port == OMX_ALL) { 959761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX); 959861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 959961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 960061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!rc_input) 960161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc_input; 960261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 960361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc_output; 960461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 960561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 960661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!streaming[v4l2_port]) { 960761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // already streamed off, warn and move on 960861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port," 960961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " which is already streamed off", v4l2_port); 961061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return 0; 961161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 961261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 961361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port); 961461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 961561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype); 961661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rc) { 961761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 96188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port); 961961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 962061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan streaming[v4l2_port] = false; 962161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 962261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 962361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return rc; 9624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 9625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 9626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop) 9627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 962861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 962961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 9630f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan unsigned int buf_size = 0, extra_data_size = 0, default_extra_data_size = 0; 96318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned int final_extra_data_size = 0; 963261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 963361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret = 0; 9634f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)", 9635f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size); 963661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 963761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = 1; 963861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 963961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 964061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 964161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 964261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 964361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 964461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 964561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 964661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 964761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 9648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 964961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet==OMX_ErrorNone) { 965061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 9651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 965261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 965361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 965461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 965561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 965661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 965761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 965861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount = bufreq.count; 965961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->mincount = bufreq.count; 96608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Count = %d",bufreq.count); 9661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 9662f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)", 9663f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size); 966461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 966561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 966661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 966761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 966861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 966961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 967061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan update_resolution(fmt.fmt.pix_mp.width, 967161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height, 967261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.plane_fmt[0].bytesperline, 967361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.plane_fmt[0].reserved[0]); 967461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) 967561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes; 96768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Buffer Size = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage); 967761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 967861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 967961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 968061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 968161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 968261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 968361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int extra_idx = 0; 968461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 968561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = is_video_session_supported(); 968661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet) 968761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 968861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 968961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 969061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = buffer_prop->buffer_size; 969161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 969261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 969361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage; 969461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra_idx >= VIDEO_MAX_PLANES) { 96958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 969661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 969761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 96988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 9699f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan default_extra_data_size = VENUS_EXTRADATA_SIZE( 9700f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan drv_ctx.video_resolution.frame_height, 9701f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan drv_ctx.video_resolution.frame_width); 9702f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan final_extra_data_size = extra_data_size > default_extra_data_size ? 9703f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan extra_data_size : default_extra_data_size; 9704f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 9705f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan final_extra_data_size = (final_extra_data_size + buffer_prop->alignment - 1) & 9706f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (~(buffer_prop->alignment - 1)); 9707f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 97088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.extradata_info.size = buffer_prop->actualcount * final_extra_data_size; 970961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.extradata_info.count = buffer_prop->actualcount; 97108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.extradata_info.buffer_size = final_extra_data_size; 9711f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!secure_mode) 9712f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan buf_size += final_extra_data_size; 971361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 9714f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%u) BufSize(%d)", 9715f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size, buf_size); 97168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (extra_data_size) 97178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("GetBufReq UPDATE: extradata: TotalSize(%d) BufferSize(%lu)", 97188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.extradata_info.size, drv_ctx.extradata_info.buffer_size); 97198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 972061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (in_reconfig) // BufReq will be set to driver when port is disabled 972161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = buf_size; 972261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (buf_size != buffer_prop->buffer_size) { 972361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->buffer_size = buf_size; 972461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = set_buffer_req(buffer_prop); 972561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 9727f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%u)", 9728f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size); 972961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 9730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 9731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 9732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop) 9733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 973461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 973561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned buf_size = 0; 973661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_format fmt; 973761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_requestbuffers bufreq; 973861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int ret; 9739f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%u)", 9740f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size); 974161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 974261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf_size != buffer_prop->buffer_size) { 9743f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%u) Required(%d)", 9744f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)buffer_prop->buffer_size, buf_size); 974561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 974661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 9747f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memset(&fmt, 0x0, sizeof(struct v4l2_format)); 974861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 974961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 9750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size; 975161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 975261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 975361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 975461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 975561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 975661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 975761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 975861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 975961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 976061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 976161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 976261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 976361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 976461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 976561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret); 976661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 976761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 976861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 976961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.memory = V4L2_MEMORY_USERPTR; 977061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.count = buffer_prop->actualcount; 977161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 977261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 977361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 977461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 977561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 977661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadParameter; 977761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 977861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 977961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet==OMX_ErrorNone) { 978061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 978161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 978261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 978361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ret) { 978461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret); 978561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*TODO: How to handle this case */ 978661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 978761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (bufreq.count < buffer_prop->actualcount) { 978861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Driver refused to change the number of buffers" 978961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan " on v4l2 port %d to %d (prefers %d)", bufreq.type, 979061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_prop->actualcount, bufreq.count); 979161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 979261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 979361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.update_buffer_req()) { 979461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed"); 979561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 979661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 979761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 97986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 979961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 9800dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand} 9801dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand 9802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution() 9803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 980461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 980561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 9806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 9807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 9808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn) 9809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 981061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 9811f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan struct v4l2_format fmt; 981261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!portDefn) { 981361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 981461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 98158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("omx_vdec::update_portdef"); 981661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nVersion.nVersion = OMX_SPEC_VERSION; 981716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan portDefn->nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 981861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDomain = OMX_PortDomainVideo; 981961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.frame_rate.fps_denominator > 0) 98208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan portDefn->format.video.xFramerate = (drv_ctx.frame_rate.fps_numerator / 98218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.frame_rate.fps_denominator) << 16; //Q16 format 982261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 98238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Divide by zero"); 982461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 9825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 9826f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memset(&fmt, 0x0, sizeof(struct v4l2_format)); 982761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (0 == portDefn->nPortIndex) { 982861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirInput; 982961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount; 983061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount; 983161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size; 983261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused; 983361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eCompressionFormat = eCompressionFormat; 983461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bEnabled = m_inp_bEnabled; 983561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bPopulated = m_inp_bPopulated; 9836f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 9837f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 9838f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 983961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (1 == portDefn->nPortIndex) { 984061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int buf_size = 0; 984161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.update_buffer_req()) { 98428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed"); 984361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 984461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 984561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_buffer_req(buf_size)) { 98468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("update buffer requirements"); 984761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 984861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 984961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferSize = buf_size; 985061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirOutput; 985161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount; 985261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->nBufferCountMin = drv_ctx.op_buf.mincount; 985361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 985461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bEnabled = m_out_bEnabled; 985561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->bPopulated = m_out_bPopulated; 985661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) { 98578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error in getting color format"); 985861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorHardware; 985961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9860f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 9861f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.fmt.pix_mp.pixelformat = capture_capability; 986261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 986361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan portDefn->eDir = OMX_DirMax; 986461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d", 986561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (int)portDefn->nPortIndex); 986661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorBadPortIndex; 986761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 9868f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (is_down_scalar_enabled) { 9869f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan int ret = 0; 9870f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 9871f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (ret) { 9872f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("update_portdef : Error in getting port resolution"); 9873f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorHardware; 9874f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 9875f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan portDefn->format.video.nFrameWidth = fmt.fmt.pix_mp.width; 9876f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan portDefn->format.video.nFrameHeight = fmt.fmt.pix_mp.height; 9877f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan portDefn->format.video.nStride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline; 9878f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan portDefn->format.video.nSliceHeight = fmt.fmt.pix_mp.plane_fmt[0].reserved[0]; 9879f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 9880f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 9881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameHeight = drv_ctx.video_resolution.frame_height; 9882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameWidth = drv_ctx.video_resolution.frame_width; 9883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nStride = drv_ctx.video_resolution.stride; 9884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines; 9885f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 9886f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 98878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420Planar) || 98888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)) { 9889f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan portDefn->format.video.nStride = ALIGN(drv_ctx.video_resolution.frame_width, 16); 9890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.frame_height; 98918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 98928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("update_portdef(%u): Width = %u Height = %u Stride = %d " 98938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "SliceHeight = %u eColorFormat = %d nBufSize %u nBufCnt %u", 98948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->nPortIndex, 98958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->format.video.nFrameWidth, 98968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->format.video.nFrameHeight, 98978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (int)portDefn->format.video.nStride, 98988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->format.video.nSliceHeight, 98998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->format.video.eColorFormat, 99008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->nBufferSize, 99018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->nBufferCountActual); 9902073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava 99038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return eRet; 9904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 9905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 9906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers() 9907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 990861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 990961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufHdr = NULL; 991061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned i= 0; 991161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 991261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!m_out_mem_ptr) { 99138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation"); 991461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nBufHdrSize = 0; 991561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformEntrySize = 0; 991661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPlatformListSize = 0; 991761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int nPMEMInfoSize = 0; 991861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 991961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 992061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 992161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 99228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Setting First Output Buffer(%d)", 992361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 992461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nBufHdrSize = drv_ctx.op_buf.actualcount * 992561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_BUFFERHEADERTYPE); 992661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 992761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize = drv_ctx.op_buf.actualcount * 992861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 992961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize = drv_ctx.op_buf.actualcount * 993061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 993161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformEntrySize = drv_ctx.op_buf.actualcount * 993261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 993361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 9934f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize, 9935f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)sizeof(OMX_BUFFERHEADERTYPE), 993661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize, 993761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPlatformListSize); 9938f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("PE %d bmSize % " PRId64 , nPlatformEntrySize, 993961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_bm_count); 994061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 994161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Alloc mem for platform specific info 994261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *pPtr=NULL; 994361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 994461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nPMEMInfoSize,1); 994561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \ 994661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_bufferpayload), 994761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 994861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 994961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof (struct vdec_output_frameinfo), 995061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf.actualcount); 9951f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) { 9952f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer"); 9953f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorInsufficientResources; 9954f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 9955f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 9956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 995761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \ 995861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount); 9959f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!drv_ctx.op_buf_ion_info) { 9960f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info"); 9961f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorInsufficientResources; 9962f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 9963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 9964576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon if (dynamic_buf_mode) { 9965576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon out_dynamic_list = (struct dynamic_buf_list *) \ 9966576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon calloc (sizeof(struct dynamic_buf_list), drv_ctx.op_buf.actualcount); 9967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (out_dynamic_list) { 9968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (unsigned int i = 0; i < drv_ctx.op_buf.actualcount; i++) 9969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin out_dynamic_list[i].dup_fd = -1; 9970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 9971576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 9972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 997361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 997461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && drv_ctx.ptr_respbuffer) { 997561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr = m_out_mem_ptr; 997661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 997761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 997861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_list) + nPlatformListSize); 997961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 998061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (((char *) m_platform_entry) + nPlatformEntrySize); 998161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList = m_platform_list; 998261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry = m_platform_entry; 998361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo = m_pmem_info; 998461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 99858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 998661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 998761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Settting the entire storage nicely 99888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, 998961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr,pPlatformEntry); 99908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo); 999161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 999261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 999361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 999461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Set the values when we determine the right HxW param 999561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nAllocLen = 0; 999661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nFilledLen = 0; 999761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pAppPrivate = NULL; 999861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 999961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 1000061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry->entry = pPMEMInfo; 1000161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Initialize the Platform List 1000261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->nEntries = 1; 1000361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList->entryList = pPlatformEntry; 1000461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Keep pBuffer NULL till vdec is opened 1000561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pBuffer = NULL; 1000661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo->offset = 0; 10007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pPMEMInfo->pmem_fd = -1; 1000861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pPlatformPrivate = pPlatformList; 1000961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer[i].pmem_fd = -1; 10010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 1001161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info[i].ion_device_fd =-1; 10012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1001361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*Create a mapping between buffers*/ 1001461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 1001561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer[i].client_data = (void *) \ 1001661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &drv_ctx.ptr_outputbuffer[i]; 1001761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // Move the buffer and buffer header pointers 1001861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bufHdr++; 1001961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPMEMInfo++; 1002061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformEntry++; 1002161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPlatformList++; 1002261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1002361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 100248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\ 1002561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr, pPtr); 1002661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_out_mem_ptr) { 1002761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(m_out_mem_ptr); 1002861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr = NULL; 1002961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1003061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pPtr) { 1003161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(pPtr); 1003261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pPtr = NULL; 1003361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1003461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_outputbuffer) { 1003561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_outputbuffer); 1003661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_outputbuffer = NULL; 1003761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1003861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.ptr_respbuffer) { 1003961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.ptr_respbuffer); 1004061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ptr_respbuffer = NULL; 1004161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 10042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION 1004361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.op_buf_ion_info) { 100448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Free o/p ion context"); 1004561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan free(drv_ctx.op_buf_ion_info); 1004661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.op_buf_ion_info = NULL; 1004761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 10048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1004961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 1005061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1005161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 1005261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = OMX_ErrorInsufficientResources; 10053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1005461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 10055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 10056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 10057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs() 10058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 100598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long p1, p2, ident; 1006061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_cmd_queue tmp_q, pending_bd_q; 1006161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&m_lock); 1006261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // pop all pending GENERATE FDB from ftb queue 1006361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_ftb_q.m_size) { 1006461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.pop_entry(&p1,&p2,&ident); 1006561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_FBD) { 1006661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.insert_entry(p1,p2,ident); 1006761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 1006861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.insert_entry(p1,p2,ident); 1006961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 10070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1007161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //return all non GENERATE FDB to ftb queue 1007261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (tmp_q.m_size) { 1007361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.pop_entry(&p1,&p2,&ident); 1007461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_ftb_q.insert_entry(p1,p2,ident); 10075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1007661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // pop all pending GENERATE EDB from etb queue 1007761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (m_etb_q.m_size) { 1007861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.pop_entry(&p1,&p2,&ident); 1007961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_EBD) { 1008061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.insert_entry(p1,p2,ident); 1008161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 1008261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.insert_entry(p1,p2,ident); 10083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1008461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1008561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //return all non GENERATE FDB to etb queue 1008661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (tmp_q.m_size) { 1008761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan tmp_q.pop_entry(&p1,&p2,&ident); 1008861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_etb_q.insert_entry(p1,p2,ident); 1008961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1009061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&m_lock); 1009161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan // process all pending buffer dones 1009261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (pending_bd_q.m_size) { 1009361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pending_bd_q.pop_entry(&p1,&p2,&ident); 1009461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (ident) { 1009561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_EBD: 1009661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 100978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!"); 1009861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 1009961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1010061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 10101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1010261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case OMX_COMPONENT_GENERATE_FBD: 1010361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 101048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!"); 1010561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx_report_error (); 1010661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1010761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 10108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 10109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 10110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 10111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 10112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp) 10113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1011461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 new_frame_interval = 0; 1011561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts 1011661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan && llabs(act_timestamp - prev_ts) > 2000) { 10117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin new_frame_interval = client_set_fps ? frm_int : (act_timestamp - prev_ts) > 0 ? 10118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin llabs(act_timestamp - prev_ts) : llabs(act_timestamp - prev_ts_actual); 10119f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (new_frame_interval != frm_int || frm_int == 0) { 1012061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frm_int = new_frame_interval; 1012161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frm_int) { 1012261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_numerator = 1e6; 1012361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.frame_rate.fps_denominator = frm_int; 101248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)", 101258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator / 1012661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (float)drv_ctx.frame_rate.fps_denominator); 10127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_perf_control.request_cores(frm_int); 1012861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /* We need to report the difference between this FBD and the previous FBD 1012961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * back to the driver for clock scaling purposes. */ 1013061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_outputparm oparm; 1013161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan /*XXX: we're providing timing info as seconds per frame rather than frames 1013261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan * per second.*/ 1013361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 1013461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 1013561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1013661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_streamparm sparm; 1013761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1013861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan sparm.parm.output = oparm; 1013961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) { 1014061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \ 1014161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan performance might be affected"); 1014261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1014361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1014461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1014561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1014661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1014761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 10148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 10149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 10150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp) 10151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1015261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (rst_prev_ts && VALID_TS(act_timestamp)) { 1015361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 10154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prev_ts_actual = act_timestamp; 1015561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = false; 1015661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (VALID_TS(prev_ts)) { 1015761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool codec_cond = (drv_ctx.timestamp_adjust)? 10158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (!VALID_TS(act_timestamp) || act_timestamp < prev_ts_actual || llabs(act_timestamp - prev_ts_actual) <= 2000) : 10159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (!VALID_TS(act_timestamp) || act_timestamp <= prev_ts_actual); 10160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prev_ts_actual = act_timestamp; //unadjusted previous timestamp 1016161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (frm_int > 0 && codec_cond) { 1016261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp); 1016361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp = prev_ts + frm_int; 1016461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp); 1016561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan prev_ts = act_timestamp; 10166f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else { 10167f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (drv_ctx.picture_order == VDEC_ORDER_DISPLAY && act_timestamp < prev_ts) { 10168f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // ensure that timestamps can never step backwards when in display order 10169f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan act_timestamp = prev_ts; 10170f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 1017161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan set_frame_rate(act_timestamp); 10172f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 1017361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (frm_int > 0) // In this case the frame rate was set along 1017461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan { // with the port definition, start ts with 0 1017561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan act_timestamp = prev_ts = 0; // and correct if a valid ts is received. 1017661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan rst_prev_ts = true; 10177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 10178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 10179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 10180ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavanvoid omx_vdec::convert_color_space_info(OMX_U32 primaries, OMX_U32 range, 10181ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space, ColorAspects *aspects) 10182ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan{ 10183ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan switch (primaries) { 10184ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_BT709_5: 10185ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan *color_space = ITU_R_709; 10186ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = ColorAspects::PrimariesBT709_5; 10187ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10188ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_BT470_6_M: 10189ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = ColorAspects::PrimariesBT470_6M; 10190ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10191ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_BT601_6_625: 10192ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625; 10193ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10194ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_BT601_6_525: 10195ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan *color_space = range ? ITU_R_601_FR : ITU_R_601; 10196ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = ColorAspects::PrimariesBT601_6_525; 10197ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10198ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_GENERIC_FILM: 10199ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = ColorAspects::PrimariesGenericFilm; 10200ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10201ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_BT2020: 10202ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = ColorAspects::PrimariesBT2020; 10203ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10204187779f25a339c00d37ff09a478113f0b2047120Praveen Chavan case MSM_VIDC_UNSPECIFIED: 10205187779f25a339c00d37ff09a478113f0b2047120Praveen Chavan //Client does not expect ColorAspects::PrimariesUnspecified, but rather the supplied default 10206ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan default: 10207c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan //aspects->mPrimaries = ColorAspects::PrimariesOther; 10208c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries; 10209ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10210ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10211ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10212ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mRange = range ? ColorAspects::RangeFull : ColorAspects::RangeLimited; 10213ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10214ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan switch (transfer) { 10215ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_TRANSFER_BT709_5: 10216ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_TRANSFER_601_6_525: // case MSM_VIDC_TRANSFER_601_6_625: 10217ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10218ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10219ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_TRANSFER_BT_470_6_M: 10220ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferGamma22; 10221ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10222ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_TRANSFER_BT_470_6_BG: 10223ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferGamma28; 10224ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10225ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_TRANSFER_SMPTE_240M: 10226ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferSMPTE240M; 10227ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10228ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_TRANSFER_LINEAR: 10229ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferLinear; 10230ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10231ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_TRANSFER_IEC_61966: 10232ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferXvYCC; 10233ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10234ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_TRANSFER_BT_1361: 10235ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferBT1361; 10236ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10237ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_TRANSFER_SRGB: 10238ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferSRGB; 10239ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10240ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan default: 10241c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan //aspects->mTransfer = ColorAspects::TransferOther; 10242c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan aspects->mTransfer = m_client_color_space.sAspects.mTransfer; 10243ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10244ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10245ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10246ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan switch (matrix) { 10247ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_MATRIX_BT_709_5: 10248ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5; 10249ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10250ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_MATRIX_FCC_47: 10251ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = ColorAspects::MatrixBT470_6M; 10252ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10253ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_MATRIX_601_6_625: 10254ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_MATRIX_601_6_525: 10255ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6; 10256ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10257ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_MATRIX_SMPTE_240M: 10258ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = ColorAspects::MatrixSMPTE240M; 10259ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10260ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_MATRIX_BT_2020: 10261ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020; 10262ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10263ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_MATRIX_BT_2020_CONST: 10264ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020Constant; 10265ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10266ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan default: 10267c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan //aspects->mMatrixCoeffs = ColorAspects::MatrixOther; 10268c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs; 10269ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10270ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10271ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan} 10272ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10273c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavanvoid omx_vdec::print_debug_color_aspects(ColorAspects *aspects, const char *prefix) { 10274c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan DEBUG_PRINT_HIGH("%s : Color aspects : Primaries = %d Range = %d Transfer = %d MatrixCoeffs = %d", 10275c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan prefix, aspects->mPrimaries, aspects->mRange, aspects->mTransfer, aspects->mMatrixCoeffs); 10276c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan} 10277c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan 10278ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavanvoid omx_vdec::handle_color_space_info(void *data, unsigned int buf_index) 10279ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan{ 10280187779f25a339c00d37ff09a478113f0b2047120Praveen Chavan ColorSpace_t color_space = ITU_R_601; 10281c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan ColorAspects tempAspects; 10282c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan memset(&tempAspects, 0x0, sizeof(ColorAspects)); 10283c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan ColorAspects *aspects = &tempAspects; 10284ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10285ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan switch(output_capability) { 10286ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case V4L2_PIX_FMT_MPEG2: 10287ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan { 10288ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload; 10289ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data; 10290ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10291ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan /* Refer MPEG2 Spec @ Rec. ISO/IEC 13818-2, ITU-T Draft Rec. H.262 to 10292ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan * understand this code */ 10293ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10294ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan if (seqdisp_payload && seqdisp_payload->color_descp) { 10295ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10296ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan convert_color_space_info(seqdisp_payload->color_primaries, 1, 10297ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan seqdisp_payload->transfer_char, seqdisp_payload->matrix_coeffs, 10298ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan &color_space,aspects); 10299ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan m_disp_hor_size = seqdisp_payload->disp_width; 10300ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan m_disp_vert_size = seqdisp_payload->disp_height; 10301ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10302ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10303ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10304ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case V4L2_PIX_FMT_H264: 10305ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case V4L2_PIX_FMT_HEVC: 10306ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan { 10307ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan struct msm_vidc_vui_display_info_payload *display_info_payload; 10308ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan display_info_payload = (struct msm_vidc_vui_display_info_payload*)data; 10309ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10310ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan /* Refer H264 Spec @ Rec. ITU-T H.264 (02/2014) to understand this code */ 10311ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10312ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan if (display_info_payload->video_signal_present_flag && 10313ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan display_info_payload->color_description_present_flag) { 10314ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan convert_color_space_info(display_info_payload->color_primaries, 10315ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan display_info_payload->video_full_range_flag, 10316ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan display_info_payload->transfer_characteristics, 10317ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan display_info_payload->matrix_coefficients, 10318ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan &color_space,aspects); 10319ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10320ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10321ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10322ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case V4L2_PIX_FMT_VC1_ANNEX_G: 10323ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case V4L2_PIX_FMT_VC1_ANNEX_L: 10324ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan { 10325ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan struct msm_vidc_vc1_seqdisp_payload *vc1_seq_disp_payload; 10326ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan vc1_seq_disp_payload = (struct msm_vidc_vc1_seqdisp_payload*)data; 10327ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10328ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan /* Refer VC-1 Spec @ SMPTE Draft Standard for Television Date: 2005-08-23 10329ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan * SMPTE 421M to understand this code */ 10330ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10331ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan if (m_enable_android_native_buffers && 10332ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan vc1_seq_disp_payload->color_primaries) { 10333ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10334ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan convert_color_space_info(vc1_seq_disp_payload->color_primaries, 10335ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 1, 10336ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan vc1_seq_disp_payload->transfer_char, 10337ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan vc1_seq_disp_payload->matrix_coeffs, 10338ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan &color_space,aspects); 10339ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10340ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10341ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10342ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case V4L2_PIX_FMT_VP8: 10343ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan { 10344ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload; 10345ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data; 10346ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10347c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan /* Refer VP8 Data Format in latest VP8 spec and Decoding Guide November 2011 10348ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan * to understand this code */ 10349ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10350ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan if (vpx_color_space_payload->color_space == 0) { 10351ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan color_space = ITU_R_601; 10352ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } else { 10353ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan DEBUG_PRINT_ERROR("Unsupported Color space for VP8"); 10354ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10355ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10356ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10357ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10358ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case V4L2_PIX_FMT_VP9: 10359ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan { 10360ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload; 10361ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data; 10362ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10363ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan /* Refer VP9 Spec @ VP9 Bitstream & Decoding Process Specification - v0.6 31st March 2016 10364ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan * to understand this code */ 10365ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10366ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan switch(vpx_color_space_payload->color_space) { 10367ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_CS_BT_601: 10368ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6; 10369ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10370ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625; 10371ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mRange = m_client_color_space.sAspects.mRange; 10372ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10373ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_CS_BT_709: 10374ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan color_space = ITU_R_709; 10375ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5; 10376ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10377ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = ColorAspects::PrimariesBT709_5; 10378ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mRange = m_client_color_space.sAspects.mRange; 10379ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10380ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_CS_SMPTE_170: 10381ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5; 10382ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10383ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries; 10384ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mRange = m_client_color_space.sAspects.mRange; 10385ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10386ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_CS_SMPTE_240: 10387ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs; 10388ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferSMPTE240M; 10389ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries; 10390ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mRange = m_client_color_space.sAspects.mRange; 10391ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10392ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_CS_BT_2020: 10393ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020; 10394ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects:: TransferSMPTE170M; 10395ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = ColorAspects::PrimariesBT2020; 10396ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mRange = m_client_color_space.sAspects.mRange; 10397ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10398ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_CS_RESERVED: 10399ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = ColorAspects::MatrixOther; 10400ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferOther; 10401ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = ColorAspects::PrimariesOther; 10402ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mRange = m_client_color_space.sAspects.mRange; 10403ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10404ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_CS_RGB: 10405ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5; 10406ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10407ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mPrimaries = ColorAspects::PrimariesOther; 10408ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan aspects->mRange = m_client_color_space.sAspects.mRange; 10409ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10410ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan default: 10411ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10412ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10413ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10414ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10415ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan default: 10416ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan break; 10417ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10418c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan if (m_enable_android_native_buffers) { 10419939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan DEBUG_PRINT_HIGH("setMetaData for Color Space = 0x%x (601=%u FR=%u 709=%u)", color_space, ITU_R_601, ITU_R_601_FR, ITU_R_709); 10420939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan set_colorspace_in_handle(color_space, buf_index); 10421c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan } 10422c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan print_debug_color_aspects(aspects, "Bitstream"); 10423c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan 10424c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan if (m_internal_color_space.sAspects.mPrimaries != aspects->mPrimaries || 10425c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan m_internal_color_space.sAspects.mTransfer != aspects->mTransfer || 10426c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan m_internal_color_space.sAspects.mMatrixCoeffs != aspects->mMatrixCoeffs || 10427c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan m_internal_color_space.sAspects.mRange != aspects->mRange) { 10428c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan memcpy(&(m_internal_color_space.sAspects), aspects, sizeof(ColorAspects)); 10429c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan m_internal_color_space.bDataSpaceChanged = OMX_TRUE; 10430c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan 10431ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan DEBUG_PRINT_HIGH("Initiating PORT Reconfig"); 10432c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan print_debug_color_aspects(&(m_internal_color_space.sAspects), "Internal"); 10433c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan print_debug_color_aspects(&(m_client_color_space.sAspects), "Client"); 10434c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan 10435ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan post_event(OMX_CORE_OUTPUT_PORT_INDEX, 10436ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan OMX_QTIIndexConfigDescribeColorAspects, 10437ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan OMX_COMPONENT_GENERATE_PORT_RECONFIG); 10438ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan } 10439ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan} 10440ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan 10441939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavanvoid omx_vdec::set_colorspace_in_handle(ColorSpace_t color_space, unsigned int buf_index) { 10442939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan private_handle_t *private_handle = NULL; 10443939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan if (buf_index < drv_ctx.op_buf.actualcount && 10444939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS && 10445939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan native_buffer[buf_index].privatehandle) { 10446939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan private_handle = native_buffer[buf_index].privatehandle; 10447939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan } 10448939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan if (private_handle) { 10449939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan setMetaData(private_handle, UPDATE_COLOR_SPACE, (void*)&color_space); 10450939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan } 10451939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan} 10452939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan 10453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr) 10454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1045561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL; 1045661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_conceal_MB = 0; 104578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_TICKS time_stamp = 0; 1045861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 frame_rate = 0; 104598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long consumed_len = 0; 1046061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_MB_in_frame; 1046161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 recovery_sei_flags = 1; 1046261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int enable = 0; 104638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 1046461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int buf_index = p_buf_hdr - m_out_mem_ptr; 10465a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan if (buf_index >= drv_ctx.extradata_info.count) { 10466a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan DEBUG_PRINT_ERROR("handle_extradata: invalid index(%d) max(%d)", 10467a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan buf_index, drv_ctx.extradata_info.count); 10468a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan return; 10469a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan } 1047061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_panscan_window_payload *panscan_payload = NULL; 10471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 10472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ptr_outputbuffer[buf_index].bufferaddr == NULL) { 10473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("handle_extradata: Error: Mapped output buffer address is NULL"); 10474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return; 10475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 10476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1047761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) + 1047861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nOffset; 10479a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan 1048061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!drv_ctx.extradata_info.uaddr) { 104818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("NULL drv_ctx.extradata_info.uaddr"); 1048261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 1048361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 104848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!secure_mode && (drv_ctx.extradata_info.buffer_size > (p_buf_hdr->nAllocLen - p_buf_hdr->nFilledLen)) ) { 104858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Error: Insufficient size allocated for extra-data"); 104868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan p_extra = NULL; 104878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return; 104888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 104898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!secure_mode) 104908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) 104918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ((unsigned long)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3)); 104928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan else 104938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan p_extra = m_other_extradata; 1049461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size; 104958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 104968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) { 1049761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = NULL; 10498f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra"); 104998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return; 105008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 1050161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata; 105028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (data && p_extra) { 1050361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while ((consumed_len < drv_ctx.extradata_info.buffer_size) 105048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) { 105058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((consumed_len + data->nSize) > (unsigned)drv_ctx.extradata_info.buffer_size) { 1050661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Invalid extra data size"); 1050761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 1050861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 10509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 10510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) { 10511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_extra = NULL; 10512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra"); 10513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return; 10514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 10515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 10516ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan DEBUG_PRINT_LOW("handle_extradata: eType = 0x%x", data->eType); 1051761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch ((unsigned long)data->eType) { 105188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO: 1051961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_interlace_payload *payload; 10520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 interlace_color_format; 105218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan payload = (struct msm_vidc_interlace_payload *)(void *)data->data; 105228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (payload) { 1052361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enable = 1; 105248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan switch (payload->format) { 105258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE: 105268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 105278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan enable = 0; 105288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 105298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST: 105308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 105318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 105328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST: 105338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst; 105348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 105358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan default: 105368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("default case - set interlace to topfield"); 105378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 105388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 10539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (payload->color_format) { 10540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12: 10541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 10542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_format = VDEC_YUV_FORMAT_NV12; 10543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 10544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12_UBWC: 10545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed; 10546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_UBWC; 10547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 10548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 10549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 10550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Error - Unknown color format hint for interlaced frame"); 10551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1055261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 105538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 10554099ba28f1f5f8a916fb20c0d097c891fd8fa02b2Praveen Chavan if (m_enable_android_native_buffers) { 10555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("setMetaData INTERLACED format:%d color_format: %x enable:%d mbaff:%d", 10556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin payload->format, interlace_color_format ,enable, 105578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (p_buf_hdr->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF)?true:false); 10558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 105598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 105608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan PP_PARAM_INTERLACED, (void*)&enable); 10561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 10562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (interlace_color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) { 10563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 10564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin LINEAR_FORMAT, (void*)&interlace_color_format); 10565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 10566099ba28f1f5f8a916fb20c0d097c891fd8fa02b2Praveen Chavan } 105678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (client_extradata & OMX_INTERLACE_EXTRADATA) { 105688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan append_interlace_extradata(p_extra, payload->format, 105698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan p_buf_hdr->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF); 1057061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 1057161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1057261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 105738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_FRAME_RATE: 1057461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_framerate_payload *frame_rate_payload; 105758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_rate_payload = (struct msm_vidc_framerate_payload *)(void *)data->data; 1057661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_rate = frame_rate_payload->frame_rate; 1057761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 105788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_TIMESTAMP: 1057961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_ts_payload *time_stamp_payload; 105808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan time_stamp_payload = (struct msm_vidc_ts_payload *)(void *)data->data; 105818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan time_stamp = time_stamp_payload->timestamp_lo; 105828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan time_stamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32); 105838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan p_buf_hdr->nTimeStamp = time_stamp; 1058461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 105858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB: 1058661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_concealmb_payload *conceal_mb_payload; 105878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan conceal_mb_payload = (struct msm_vidc_concealmb_payload *)(void *)data->data; 1058861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 1058961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.video_resolution.frame_height + 15)) >> 8; 1059061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0); 1059161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 105928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_INDEX: 1059361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan int *etype; 105948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan etype = (int *)(void *)data->data; 105958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (etype && *etype == MSM_VIDC_EXTRADATA_ASPECT_RATIO) { 1059661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload; 1059761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)(++etype); 1059861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (aspect_ratio_payload) { 1059961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((struct vdec_output_frameinfo *) 1060061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width; 1060161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((struct vdec_output_frameinfo *) 1060261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height; 1060361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1060461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1060561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 106068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI: 1060761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_recoverysei_payload *recovery_sei_payload; 106088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)(void *)data->data; 1060961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan recovery_sei_flags = recovery_sei_payload->flags; 106108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) { 1061161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 106128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("***************************************************"); 106138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received"); 106148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("***************************************************"); 1061561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1061661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 106178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW: 106188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan panscan_payload = (struct msm_vidc_panscan_window_payload *)(void *)data->data; 106198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (panscan_payload->num_panscan_windows > MAX_PAN_SCAN_WINDOWS) { 106208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Panscan windows are more than supported\n"); 106218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Max supported = %d FW returned = %d\n", 106228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan MAX_PAN_SCAN_WINDOWS, panscan_payload->num_panscan_windows); 106238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return; 106248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 1062561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 106268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_MPEG2_SEQDISP: 10627ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_EXTRADATA_VUI_DISPLAY_INFO: 10628ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_EXTRADATA_VC1_SEQDISP: 10629ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan case MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO: 10630ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan handle_color_space_info((void *)data->data, buf_index); 1063161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 106328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_S3D_FRAME_PACKING: 106338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload; 106348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan s3d_frame_packing_payload = (struct msm_vidc_s3d_frame_packing_payload *)(void *)data->data; 106358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (client_extradata & OMX_FRAMEPACK_EXTRADATA) { 106368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan append_framepack_extradata(p_extra, s3d_frame_packing_payload); 106378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 106388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 106398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 106408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_FRAME_QP: 106418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct msm_vidc_frame_qp_payload *qp_payload; 106428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan qp_payload = (struct msm_vidc_frame_qp_payload*)(void *)data->data; 106438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (client_extradata & OMX_QP_EXTRADATA) { 106448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan append_qp_extradata(p_extra, qp_payload); 106458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 106468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 106478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 106488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_FRAME_BITS_INFO: 106498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct msm_vidc_frame_bits_info_payload *bits_info_payload; 106508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan bits_info_payload = (struct msm_vidc_frame_bits_info_payload*)(void *)data->data; 106518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (client_extradata & OMX_BITSINFO_EXTRADATA) { 106528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan append_bitsinfo_extradata(p_extra, bits_info_payload); 106538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 106548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 106558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 106568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case MSM_VIDC_EXTRADATA_STREAM_USERDATA: 106578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (client_extradata & OMX_EXTNUSER_EXTRADATA) { 106588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan append_user_extradata(p_extra, data); 106598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 106608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 106618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan break; 10662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case MSM_VIDC_EXTRADATA_VQZIP_SEI: 10663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct msm_vidc_vqzip_sei_payload *vqzip_payload; 10664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vqzip_payload = (struct msm_vidc_vqzip_sei_payload*)(void *)data->data; 10665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (client_extradata & OMX_VQZIPSEI_EXTRADATA) { 10666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 10667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin append_vqzip_extradata(p_extra, vqzip_payload); 10668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 106696ee2d713ec3877635f654ba65aa95395e5323eb6Praveen Chavan } 106706ee2d713ec3877635f654ba65aa95395e5323eb6Praveen Chavan break; 1067161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 106728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Unrecognized extradata"); 1067361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto unrecognized_extradata; 1067461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1067561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan consumed_len += data->nSize; 1067661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 1067761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 106788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (client_extradata & OMX_FRAMEINFO_EXTRADATA) { 1067961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 1068061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_frame_info_extradata(p_extra, 1068161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate, 106828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan time_stamp, panscan_payload,&((struct vdec_output_frameinfo *) 1068361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info); 106848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 106858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 106868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (client_extradata & OMX_FRAMEDIMENSION_EXTRADATA) { 106878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan append_frame_dimension_extradata(p_extra); 106888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 1068961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1069061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 106916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalunrecognized_extradata: 106928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (client_extradata && p_extra) { 106938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 1069461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan append_terminator_extradata(p_extra); 106958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 10696f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (secure_mode && p_extradata && m_other_extradata) { 106978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct vdec_output_frameinfo *ptr_extradatabuff = NULL; 106988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan memcpy(p_extradata, m_other_extradata, drv_ctx.extradata_info.buffer_size); 106998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ptr_extradatabuff = (struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate; 107008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ptr_extradatabuff->metadata_info.metabufaddr = (void *)p_extradata; 107018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ptr_extradatabuff->metadata_info.size = drv_ctx.extradata_info.buffer_size; 107028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 1070361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 10704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 10705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 107066eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, 1070761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool is_internal, bool enable) 10708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1070961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE ret = OMX_ErrorNone; 1071061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct v4l2_control control; 1071161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_state != OMX_StateLoaded) { 1071261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only"); 1071361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorIncorrectStateOperation; 1071461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 107158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%u] requested[%u] enable[%d], is_internal: %d", 107168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)client_extradata, (unsigned int)requested_extradata, enable, is_internal); 1071761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1071861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!is_internal) { 1071961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enable) 1072061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata |= requested_extradata; 1072161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 1072261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan client_extradata = client_extradata & ~requested_extradata; 1072361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1072461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1072561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enable) { 1072661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (requested_extradata & OMX_INTERLACE_EXTRADATA) { 1072761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1072861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO; 1072961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1073061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("Failed to set interlaced extradata." 107318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Quality of interlaced clips might be impacted."); 1073261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 107338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 107348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) { 1073561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1073661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE; 1073761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 107388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set framerate extradata"); 1073961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1074061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1074161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB; 1074261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 107438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set concealed MB extradata"); 1074461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1074561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1074661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI; 1074761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 107488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata"); 1074961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1075061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1075161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW; 1075261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 107538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 1075461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1075561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 107568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO; 1075761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 107588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 1075961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 10760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (output_capability == V4L2_PIX_FMT_MPEG2) { 10761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 10762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.value = V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP; 10763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 10764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 10765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1076661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 10767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 107688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (requested_extradata & OMX_TIMEINFO_EXTRADATA) { 1076961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1077061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP; 1077161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 107728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set timeinfo extradata"); 107738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 107748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 107758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (requested_extradata & OMX_FRAMEPACK_EXTRADATA) { 107768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (output_capability == V4L2_PIX_FMT_H264) { 107778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("enable OMX_FRAMEPACK_EXTRADATA"); 107788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 107798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_S3D_FRAME_PACKING; 107808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 107818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set S3D_FRAME_PACKING extradata"); 107828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 107838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 107848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("OMX_FRAMEPACK_EXTRADATA supported for H264 only"); 107858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 107868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 107878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (requested_extradata & OMX_QP_EXTRADATA) { 107888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 107898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP; 107908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 107918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set QP extradata"); 107928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 107938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 107948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (requested_extradata & OMX_BITSINFO_EXTRADATA) { 107958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 107968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_BITS_INFO; 107978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 107988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set frame bits info extradata"); 107998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 108008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 108018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (requested_extradata & OMX_EXTNUSER_EXTRADATA) { 10802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (secure_mode) { 10803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("ExtnUser Extra Data not supported for secure sessions"); 10804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorUnsupportedSetting; 10805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 108068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 108078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_STREAM_USERDATA; 108088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 108098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("Failed to set stream userdata extradata"); 1081061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1081161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 10812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (requested_extradata & OMX_VQZIPSEI_EXTRADATA) { 10813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 10814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.value = V4L2_MPEG_VIDC_EXTRADATA_VQZIP_SEI; 10815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 10816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Failed to set VQZip SEI extradata"); 10817f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 10818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extradata |= OMX_VQZIPSEI_EXTRADATA; 10819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 108206ee2d713ec3877635f654ba65aa95395e5323eb6Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 10821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP; 108226ee2d713ec3877635f654ba65aa95395e5323eb6Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 10823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Failed to set QP extradata"); 108246ee2d713ec3877635f654ba65aa95395e5323eb6Praveen Chavan } 10825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extradata |= OMX_QP_EXTRADATA; 108266ee2d713ec3877635f654ba65aa95395e5323eb6Praveen Chavan } 10827da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan if (requested_extradata & OMX_DISPLAY_INFO_EXTRADATA) { 10828da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 10829da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan switch(output_capability) { 10830da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan case V4L2_PIX_FMT_H264: 10831da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan case V4L2_PIX_FMT_HEVC: 10832da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_VUI_DISPLAY; 10833da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan break; 10834da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan case CODEC_TYPE_MPEG2: 10835da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP; 10836da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan break; 10837da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan case V4L2_PIX_FMT_VP8: 10838da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan case V4L2_PIX_FMT_VP9: 10839da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_VPX_COLORSPACE; 10840da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan break; 10841da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan case V4L2_PIX_FMT_VC1_ANNEX_G: 10842da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan case V4L2_PIX_FMT_VC1_ANNEX_L: 10843da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan control.value = V4L2_MPEG_VIDC_EXTRADATA_VC1_SEQDISP; 10844da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan break; 10845da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan default: 10846da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan DEBUG_PRINT_HIGH("Don't support Disp info for this codec : %s", drv_ctx.kind); 10847da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan return ret; 10848da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan } 10849da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan 10850da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 10851da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan DEBUG_PRINT_HIGH("Failed to set Display info extradata"); 10852da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan } 10853da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan } 1085461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1085561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = get_buffer_req(&drv_ctx.op_buf); 1085661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ret; 10857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 10858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 10859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra) 10860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1086161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0; 1086261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *data_ptr = extra->data, data = 0; 1086361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (byte_count < extra->nDataSize) { 1086461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data = *data_ptr; 1086561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (data) { 1086661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB += (data&0x01); 1086761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data >>= 1; 1086861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1086961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan data_ptr++; 1087061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan byte_count++; 1087161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1087261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 1087361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (drv_ctx.video_resolution.frame_height + 15)) >> 8; 1087461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0); 10875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 10876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 10877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra) 10878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 108798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!m_debug_extradata || !extra) 1088061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 10881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 108828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 10883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev DEBUG_PRINT_HIGH( 1088461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "============== Extra Data ==============\n" 108858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Size: %u\n" 108868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Version: %u\n" 108878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " PortIndex: %u\n" 108888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Type: %x\n" 108898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " DataSize: %u", 108908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)extra->nSize, (unsigned int)extra->nVersion.nVersion, 108918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)extra->nPortIndex, extra->eType, (unsigned int)extra->nDataSize); 1089261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1089361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) { 108948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data; 1089561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 1089661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "------ Interlace Format ------\n" 108978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Size: %u\n" 108988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Version: %u\n" 108998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " PortIndex: %u\n" 109008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Is Interlace Format: %d\n" 109018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Interlace Formats: %u\n" 109028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "=========== End of Interlace ===========", 109038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)intfmt->nSize, (unsigned int)intfmt->nVersion.nVersion, (unsigned int)intfmt->nPortIndex, 109048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan intfmt->bInterlaceFormat, (unsigned int)intfmt->nInterlaceFormats); 1090561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) { 109068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data; 1090761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1090861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 1090961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan "-------- Frame Format --------\n" 109108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Picture Type: %d\n" 109118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Interlace Type: %d\n" 109128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Pan Scan Total Frame Num: %u\n" 109138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Concealed Macro Blocks: %u\n" 109148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " frame rate: %u\n" 109158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Time Stamp: %llu\n" 109168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Aspect Ratio X: %u\n" 109178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Aspect Ratio Y: %u", 1091861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->ePicType, 1091961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fminfo->interlaceType, 109208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)fminfo->panScan.numWindows, 109218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)fminfo->nConcealedMacroblocks, 109228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)fminfo->nFrameRate, 109238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan fminfo->nTimeStamp, 109248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)fminfo->aspectRatio.aspectRatioX, 109258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)fminfo->aspectRatio.aspectRatioY); 1092661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1092761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) { 1092861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH( 109298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "------------------------------" 109308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Pan Scan Frame Num: %u\n" 109318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Rectangle x: %d\n" 109328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Rectangle y: %d\n" 109338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Rectangle dx: %d\n" 109348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Rectangle dy: %d", 109358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)i, (unsigned int)fminfo->panScan.window[i].x, (unsigned int)fminfo->panScan.window[i].y, 109368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)fminfo->panScan.window[i].dx, (unsigned int)fminfo->panScan.window[i].dy); 1093761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1093861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1093961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("========= End of Frame Format =========="); 109408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement) { 109418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data; 109428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH( 109438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "------------------ Framepack Format ----------\n" 109448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " id: %u \n" 109458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " cancel_flag: %u \n" 109468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " type: %u \n" 109478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " quincunx_sampling_flagFormat: %u \n" 109488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " content_interpretation_type: %u \n" 109498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " spatial_flipping_flag: %u \n" 109508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " frame0_flipped_flag: %u \n" 109518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " field_views_flag: %u \n" 109528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " current_frame_is_frame0_flag: %u \n" 109538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " frame0_self_contained_flag: %u \n" 109548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " frame1_self_contained_flag: %u \n" 109558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " frame0_grid_position_x: %u \n" 109568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " frame0_grid_position_y: %u \n" 109578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " frame1_grid_position_x: %u \n" 109588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " frame1_grid_position_y: %u \n" 109598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " reserved_byte: %u \n" 109608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " repetition_period: %u \n" 109618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " extension_flag: %u \n" 109628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "================== End of Framepack ===========", 109638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->id, 109648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->cancel_flag, 109658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->type, 109668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->quincunx_sampling_flag, 109678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->content_interpretation_type, 109688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->spatial_flipping_flag, 109698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->frame0_flipped_flag, 109708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->field_views_flag, 109718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->current_frame_is_frame0_flag, 109728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->frame0_self_contained_flag, 109738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->frame1_self_contained_flag, 109748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->frame0_grid_position_x, 109758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->frame0_grid_position_y, 109768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->frame1_grid_position_x, 109778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->frame1_grid_position_y, 109788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->reserved_byte, 109798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->repetition_period, 109808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)framepack->extension_flag); 109818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataQP) { 109828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_QCOM_EXTRADATA_QP * qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data; 109838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH( 109848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "---- QP (Frame quantization parameter) ----\n" 109858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Frame QP: %u \n" 109868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "================ End of QP ================\n", 109878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)qp->nQP); 109888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo) { 109898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_QCOM_EXTRADATA_BITS_INFO * bits = (OMX_QCOM_EXTRADATA_BITS_INFO *)(void *)extra->data; 109908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH( 109918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "--------- Input bits information --------\n" 109928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Header bits: %u \n" 109938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Frame bits: %u \n" 109948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "===== End of Input bits information =====\n", 109958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)bits->header_bits, (unsigned int)bits->frame_bits); 109968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData) { 109978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_QCOM_EXTRADATA_USERDATA *userdata = (OMX_QCOM_EXTRADATA_USERDATA *)(void *)extra->data; 109988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U8 *data_ptr = (OMX_U8 *)userdata->data; 109998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 userdata_size = extra->nDataSize - sizeof(userdata->type); 110008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 i = 0; 110018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH( 110028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "-------------- Userdata -------------\n" 110038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " Stream userdata type: %u\n" 110048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " userdata size: %u\n" 110058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan " STREAM_USERDATA:", 110068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)userdata->type, (unsigned int)userdata_size); 110078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan for (i = 0; i < userdata_size; i+=4) { 110088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH(" %x %x %x %x", 110098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan data_ptr[i], data_ptr[i+1], 110108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan data_ptr[i+2], data_ptr[i+3]); 110118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 110128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH( 110138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "=========== End of Userdata ==========="); 11014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI) { 11015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_EXTRADATA_VQZIPSEI *vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data; 11016f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH( 11017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "-------------- VQZip -------------\n" 11018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " Size: %u\n", 11019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned int)vq->nSize); 11020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH( "=========== End of VQZip ==========="); 1102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else if (extra->eType == OMX_ExtraDataNone) { 1102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("========== End of Terminator ==========="); 1102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 1102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_HIGH("======= End of Driver Extradata ========"); 1102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 11026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 11027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 11028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 110298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_U32 interlaced_format_type, bool is_mbaff) 11030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_STREAMINTERLACEFORMAT *interlace_format; 110328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 1103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) { 1103461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 1103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 11036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!extra) { 11037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Error: append_interlace_extradata - invalid input"); 11038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return; 11039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE; 1104161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 1104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat; 1104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT); 110458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan interlace_format = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data; 1104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT); 1104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nVersion.nVersion = OMX_SPEC_VERSION; 1104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 110498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 110508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) && !is_mbaff) { 1105161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->bInterlaceFormat = OMX_FALSE; 1105261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive; 1105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 110548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if ((interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST) && !is_mbaff) { 110558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan interlace_format->bInterlaceFormat = OMX_TRUE; 110568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst; 110578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 110588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else if ((interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST) && !is_mbaff) { 110598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan interlace_format->bInterlaceFormat = OMX_TRUE; 110608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameBottomFieldFirst; 110618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 1106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 1106361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->bInterlaceFormat = OMX_TRUE; 1106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst; 1106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 1106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 11068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 11069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 110708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_frame_dimension_extradata(OMX_OTHER_EXTRADATATYPE *extra) 110718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{ 110728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEDIMENSION *frame_dimension; 110738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!(client_extradata & OMX_FRAMEDIMENSION_EXTRADATA)) { 110748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return; 110758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 110768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nSize = OMX_FRAMEDIMENSION_EXTRADATA_SIZE; 110778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 110788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 110798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameDimension; 110808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEDIMENSION); 110818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_dimension = (OMX_QCOM_EXTRADATA_FRAMEDIMENSION *)(void *)extra->data; 110828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_dimension->nDecWidth = rectangle.nLeft; 110838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_dimension->nDecHeight = rectangle.nTop; 110848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_dimension->nActualWidth = rectangle.nWidth; 110858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_dimension->nActualHeight = rectangle.nHeight; 110868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 110878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 110886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::fill_aspect_ratio_info( 1108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct vdec_aspectratioinfo *aspect_ratio_info, 1109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info) 110916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 1109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata = frame_info; 1109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width; 1109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height; 110958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("aspectRatioX %u aspectRatioY %u", (unsigned int)m_extradata->aspectRatio.aspectRatioX, 110968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)m_extradata->aspectRatio.aspectRatioY); 110976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 11098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 11099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate, 111018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_TICKS time_stamp, struct msm_vidc_panscan_window_payload *panscan_payload, 111026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal struct vdec_aspectratioinfo *aspect_ratio_info) 11103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL; 1110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan struct msm_vidc_panscan_window *panscan_window; 1110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) { 111076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return; 1110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE; 1111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 1111161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo; 1111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO); 111148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data; 1111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan switch (picture_type) { 1111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_I: 1111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeI; 1111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 1111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_P: 1112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeP; 1112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 1112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan case PICTURE_TYPE_B: 1112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = OMX_VIDEO_PictureTypeB; 1112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan break; 1112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan default: 1112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0; 1112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 1112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 1113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 1113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 1113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 1113361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive; 1113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio)); 1113561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->nConcealedMacroblocks = num_conceal_mb; 1113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->nFrameRate = frame_rate; 111378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_info->nTimeStamp = time_stamp; 1113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.numWindows = 0; 1113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (output_capability == V4L2_PIX_FMT_MPEG2) { 1114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_disp_hor_size && m_disp_vert_size) { 1114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size; 1114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size; 111438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 111448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_info->displayAspectRatio.displayHorizontalSize = 0; 111458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan frame_info->displayAspectRatio.displayVerticalSize = 0; 1114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (panscan_payload) { 1115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.numWindows = panscan_payload->num_panscan_windows; 1115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_window = &panscan_payload->wnd[0]; 1115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) { 1115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].x = panscan_window->panscan_window_width; 1115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].y = panscan_window->panscan_window_height; 1115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset; 1115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset; 1115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan panscan_window++; 1115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1115961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan fill_aspect_ratio_info(aspect_ratio_info, frame_info); 1116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 11162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 11163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 11164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra) 11165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1116661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL; 1116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE; 1116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 1116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef; 1117161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 111728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)(void *)extra->data; 1117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *portDefn = m_port_def; 111748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u " 111758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan "stride = %u sliceheight = %u",(unsigned int)portDefn->format.video.nFrameHeight, 111768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->format.video.nFrameWidth, 111778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->format.video.nStride, 111788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)portDefn->format.video.nSliceHeight); 111798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 111808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 111818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra, 111828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload) 111838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{ 111848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack; 111858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (FRAME_PACK_SIZE*sizeof(OMX_U32) != sizeof(struct msm_vidc_s3d_frame_packing_payload)) { 111868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("frame packing size mismatch"); 111878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return; 111888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 111898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nSize = OMX_FRAMEPACK_EXTRADATA_SIZE; 111908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 111918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 111928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement; 111938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nDataSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT); 111948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data; 111958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan framepack->nSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT); 111968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan framepack->nVersion.nVersion = OMX_SPEC_VERSION; 111978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan framepack->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 111988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan memcpy(&framepack->id, s3d_frame_packing_payload, 111998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan sizeof(struct msm_vidc_s3d_frame_packing_payload)); 112008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan memcpy(&m_frame_pack_arrangement, framepack, 112018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT)); 112028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan print_debug_extradata(extra); 112038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 112048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 112058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra, 112068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct msm_vidc_frame_qp_payload *qp_payload) 112078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{ 112088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_QCOM_EXTRADATA_QP * qp = NULL; 112098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!qp_payload) { 112108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("QP payload is NULL"); 112118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return; 112128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 112138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nSize = OMX_QP_EXTRADATA_SIZE; 112148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 112158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 112168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataQP; 112178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_QP); 112188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data; 112198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan qp->nQP = qp_payload->frame_qp; 112208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan print_debug_extradata(extra); 112218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 112228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 112238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra, 112248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct msm_vidc_frame_bits_info_payload *bits_payload) 112258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{ 112268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_QCOM_EXTRADATA_BITS_INFO * bits = NULL; 112278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (!bits_payload) { 112288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("bits info payload is NULL"); 112298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return; 112308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 112318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nSize = OMX_BITSINFO_EXTRADATA_SIZE; 112328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 112338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 112348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo; 112358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_BITS_INFO); 112368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan bits = (OMX_QCOM_EXTRADATA_BITS_INFO*)(void *)extra->data; 112378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan bits->frame_bits = bits_payload->frame_bits; 112388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan bits->header_bits = bits_payload->header_bits; 112398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan print_debug_extradata(extra); 112408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 112418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 112428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, 112438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan OMX_OTHER_EXTRADATATYPE *p_user) 112448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{ 112458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan int userdata_size = 0; 112468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan struct msm_vidc_stream_userdata_payload *userdata_payload = NULL; 112478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan userdata_payload = 112488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (struct msm_vidc_stream_userdata_payload *)(void *)p_user->data; 112498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan userdata_size = p_user->nDataSize; 11250f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan extra->nSize = OMX_USERDATA_EXTRADATA_SIZE + userdata_size; 112518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 112528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 112538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData; 112548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan extra->nDataSize = userdata_size; 11255ce256dab580d6601e34cf59642f642bd496952aePatrick Tjin if (extra->nDataSize && (p_user->nDataSize >= extra->nDataSize)) 112568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan memcpy(extra->data, p_user->data, extra->nDataSize); 112578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan print_debug_extradata(extra); 11258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 11259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 11260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra) 11261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1126261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!client_extradata) { 1126361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 1126461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1126561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE); 1126661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nVersion.nVersion = OMX_SPEC_VERSION; 1126761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->eType = OMX_ExtraDataNone; 1126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->nDataSize = 0; 1126961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan extra->data[0] = 0; 1127061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1127161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan print_debug_extradata(extra); 11272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 11273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 11274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdec::append_vqzip_extradata(OMX_OTHER_EXTRADATATYPE *extra, 11275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct msm_vidc_vqzip_sei_payload *vqzip_payload) 11276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 11277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_EXTRADATA_VQZIPSEI *vq = NULL; 11278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 11279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extra->nSize = OMX_VQZIPSEI_EXTRADATA_SIZE + vqzip_payload->size; 11280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extra->nVersion.nVersion = OMX_SPEC_VERSION; 11281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 11282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI; 11283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_VQZIPSEI) + vqzip_payload->size; 11284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 11285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data; 11286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vq->nSize = vqzip_payload->size; 11287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(vq->data, vqzip_payload->data, vqzip_payload->size); 11288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 11289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin print_debug_extradata(extra); 11290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 11291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 11292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_desc_buffer(OMX_U32 index) 11293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 1129561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index >= drv_ctx.ip_buf.actualcount) { 112968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found"); 1129761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 1129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 1130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr = (desc_buffer_hdr*) \ 1130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan calloc( (sizeof(desc_buffer_hdr)), 1130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan drv_ctx.ip_buf.actualcount); 1130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 113048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed "); 1130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 1130661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 11307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 11308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8)); 1131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr[index].buf_addr == NULL) { 113118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("desc buffer Allocation failed "); 1131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 1131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 11314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 1131561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 11316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 11317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 11318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset) 11319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 113208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Inserting address offset (%u) at idx (%u)", (unsigned int)address_offset,(unsigned int)m_demux_entries); 1132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_demux_entries < 8192) { 1132261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_offsets[m_demux_entries++] = address_offset; 1132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1132461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 11325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 11326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 11327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr) 11328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1132961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 bytes_to_parse = buf_hdr->nFilledLen; 1133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset; 1133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 index = 0; 1133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 1133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan while (index < bytes_to_parse) { 1133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 1133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) || 1133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 1133961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan (buf[index+2] == 0x01)) ) { 1134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Found start code, insert address offset 1134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan insert_demux_addr_offset(index); 1134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buf[index+2] == 0x01) // 3 byte start code 1134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index += 3; 1134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else //4 byte start code 1134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index += 4; 1134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 1134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index++; 11348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 113498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Extracted (%u) demux entry offsets", (unsigned int)m_demux_entries); 1135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return; 11351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 11352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 11353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr) 11354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 1135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //fix this, handle 3 byte start code, vc1 terminator entry 1135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U8 *p_demux_data = NULL; 1135761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 desc_data = 0; 1135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 start_addr = 0; 1135961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 nal_size = 0; 1136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 suffix_byte = 0; 1136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 demux_index = 0; 1136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_U32 buffer_index = 0; 1136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (m_desc_buffer_ptr == NULL) { 1136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries."); 1136661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 1136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1136861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1136961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 1137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_index > drv_ctx.ip_buf.actualcount) { 113718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%u)", (unsigned int)buffer_index); 1137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 1137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr; 1137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ( ((OMX_U8*)p_demux_data == NULL) || 1137861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) { 1137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries."); 1138061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 1138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 1138261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (; demux_index < m_demux_entries; demux_index++) { 1138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0; 1138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan start_addr = m_demux_offsets[demux_index]; 1138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) { 1138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3]; 1138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 1138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4]; 1138961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (demux_index < (m_demux_entries - 1)) { 1139161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2; 1139261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 1139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2; 1139461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 113958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Start_addr(0x%x), suffix_byte(0x%x),nal_size(%u),demux_index(%u)", 113968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)start_addr, 113978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)suffix_byte, 113988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)nal_size, 113998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)demux_index); 1140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = (start_addr >> 3) << 1; 1140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data |= (start_addr & 7) << 21; 1140261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data |= suffix_byte << 24; 1140361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 1140561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32)); 1140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 1140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 1140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1140961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data += 16; 1141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1141161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (codec_type_parse == CODEC_TYPE_VC1) { 1141261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("VC1 terminator entry"); 1141361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0; 1141461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan desc_data = 0x82 << 24; 1141561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 1141661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 4, 0, sizeof(OMX_U32)); 1141761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 1141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 1141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan p_demux_data += 16; 1142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries++; 1142161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1142261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan //Add zero word to indicate end of descriptors 1142361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(p_demux_data, 0, sizeof(OMX_U32)); 1142461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1142561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32); 114268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("desc table data size=%u", (unsigned int)m_desc_buffer_ptr[buffer_index].desc_data_size); 1142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1142861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 1142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_demux_entries = 0; 1143061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan DEBUG_PRINT_LOW("Demux table complete!"); 1143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 11432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 11433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 11434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdec::request_perf_level(enum vidc_perf_level perf_level) 11435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{ 11436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_control control; 11437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin char property_value[PROPERTY_VALUE_MAX] = {0}; 11438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 11439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property_get("vidc.debug.turbo", property_value, "0"); 11440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&control, 0, sizeof(v4l2_control)); 11441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL; 11442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (perf_level) { 11443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VIDC_NOMINAL: 11444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (atoi(property_value)) 11445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO; 11446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 11447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL; 11448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 11449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VIDC_TURBO: 11450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO; 11451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 11452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 11453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Requested PERF level not supported"); 11454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 11455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 11456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((current_perf_level == (OMX_U32)control.value) && !in_reconfig) 11457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return; 11458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 11459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("changing performance level to %d", control.value); 11460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 11461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin current_perf_level = control.value; 1146261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 11463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to set PERF level"); 1146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 11465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev} 114666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 114676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf() 114686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 1146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 1147061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = NULL; 1147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_members(); 1147261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat = OMX_COLOR_FormatMax; 114738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan dest_format = YCbCr420P; 114746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 114756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 114766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client) 114776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 1147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx = reinterpret_cast<omx_vdec*>(client); 114796eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 114806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 1148161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::allocate_color_convert_buf::init_members() 1148261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 1148361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count = 0; 1148461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = 0; 1148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = 0; 1148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_platform_list_client,0,sizeof(m_platform_list_client)); 1148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_platform_entry_client,0,sizeof(m_platform_entry_client)); 1148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_pmem_info_client,0,sizeof(m_pmem_info_client)); 1148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client)); 114906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 1149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan memset(op_buf_ion_info,0,sizeof(m_platform_entry_client)); 11492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif 1149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan for (int i = 0; i < MAX_COUNT; i++) 1149461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[i] = -1; 114956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 114966eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 1149761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() 1149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 1149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 115006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 11501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 115026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::update_buffer_req() 115036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 1150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 1150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int src_size = 0, destination_size = 0; 1150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE drv_color_format; 1150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 115088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid client in color convert"); 1150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 1151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 115128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("No color conversion required"); 1151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 1151461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 1151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 && 1151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ColorFormat != OMX_COLOR_FormatYUV420Planar) { 115188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion"); 1151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 1152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto fail_update_buf_req; 1152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 1152361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.open(omx->drv_ctx.video_resolution.frame_height, 1152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->drv_ctx.video_resolution.frame_width, 115258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan NV12_128m,dest_format); 1152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) { 1152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.get_buffer_size(C2D_INPUT,src_size); 1152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) 1152961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.get_buffer_size(C2D_OUTPUT,destination_size); 1153061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1153161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status) { 1153261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size || 1153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan !destination_size) { 115348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d" 11535f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan "driver size %u destination size %d", 11536f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan src_size, (unsigned int)omx->drv_ctx.op_buf.buffer_size, 11537f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan destination_size); 1153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 1153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 1154061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = 0; 1154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 1154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = destination_size; 1154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size) 1154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req = omx->drv_ctx.op_buf.buffer_size; 1154561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment) 1154661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = omx->drv_ctx.op_buf.alignment; 1154761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 115486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 115496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_update_buf_req: 1155061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 1155161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 115526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 115536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 115546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::set_color_format( 1155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE dest_color_format) 115566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 1155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 1155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_COLOR_FORMATTYPE drv_color_format; 1155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 115608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid client in color convert"); 1156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return false; 1156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 1156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 115658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) 115668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_color_format = (OMX_COLOR_FORMATTYPE) 115678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView; 115688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan else 11569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_color_format = (OMX_COLOR_FORMATTYPE) 11570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 11571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) { 11572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_color_format = (OMX_COLOR_FORMATTYPE) 11573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed; 11574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 115758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Incorrect color format"); 115766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal status = false; 115776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 11578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (status && 115798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_color_format != dest_color_format && 115808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan drv_color_format != (OMX_COLOR_FORMATTYPE) 11581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView && 11582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_color_format != (OMX_COLOR_FORMATTYPE) 11583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed && 11584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin dest_color_format != (OMX_COLOR_FORMATTYPE) 11585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) { 115868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("Enabling C2D"); 115878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((dest_color_format != OMX_COLOR_FormatYUV420Planar) && 115888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (dest_color_format != OMX_COLOR_FormatYUV420SemiPlanar)) { 115898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Unsupported color format for c2d"); 1159061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 1159161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 115928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ColorFormat = dest_color_format; 115938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan dest_format = (dest_color_format == OMX_COLOR_FormatYUV420Planar) ? 115948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan YCbCr420P : YCbCr420SP; 1159561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled) 1159661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 1159761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 1159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!c2d.init()) { 115998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("open failed for c2d"); 1160061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 1160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 1160261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = true; 1160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1160461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 1160561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled) 1160661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.destroy(); 1160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan enabled = false; 1160861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1160961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 1161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 116116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 116126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 116136eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr() 116146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 1161561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 116168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 1161761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 1161861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1161961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 1162061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->m_out_mem_ptr; 1162161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return m_out_mem_ptr_client; 116226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 116236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 1162461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr 1162561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd) 116266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 1162761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 116288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 1162961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 1163061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1163161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 1163261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bufadd; 1163361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1163461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned index = 0; 1163561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufadd - omx->m_out_mem_ptr; 1163661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < omx->drv_ctx.op_buf.actualcount) { 1163761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS); 1163861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp; 1163961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status; 1164061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) { 1164161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 11642f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan cache_clean_buffer(index); 1164361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd, 1164461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer, pmem_fd[index], 1164561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[index], pmem_baseaddress[index]); 1164661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!status) { 116478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed color conversion %d", status); 1164861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = 0; 116492278148b3ae1838153fe2319ddbc2e058e754079Zhijun He pthread_mutex_unlock(&omx->c_lock); 1165061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return &m_out_mem_ptr_client[index]; 11651a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan } else { 11652a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan unsigned int filledLen = 0; 11653a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan c2d.get_output_filled_length(filledLen); 11654a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = filledLen; 11655f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan cache_clean_invalidate_buffer(index); 1165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 116572278148b3ae1838153fe2319ddbc2e058e754079Zhijun He pthread_mutex_unlock(&omx->c_lock); 1165861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else 1165961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[index].nFilledLen = 0; 116606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return &m_out_mem_ptr_client[index]; 1166161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 116628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr"); 1166361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 116646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 116656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 1166661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr 1166761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd) 116686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 1166961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!omx) { 116708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 1167161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 1167261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1167361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 1167461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return bufadd; 1167561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned index = 0; 1167661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufadd - m_out_mem_ptr_client; 1167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index < omx->drv_ctx.op_buf.actualcount) { 1167861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return &omx->m_out_mem_ptr[index]; 1167961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 116808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr"); 116816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return NULL; 116826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 1168361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool omx_vdec::allocate_color_convert_buf::get_buffer_req 1168461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(unsigned int &buffer_size) 116856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 1168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 1168761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 1168861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 1168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size = omx->drv_ctx.op_buf.buffer_size; 1169061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else { 1169161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) { 116928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Get buffer size failed"); 1169361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 1169461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan goto fail_get_buffer_size; 1169561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1169661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1169761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_size < omx->drv_ctx.op_buf.buffer_size) 116986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal buffer_size = omx->drv_ctx.op_buf.buffer_size; 1169961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment) 1170061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_alignment_req = omx->drv_ctx.op_buf.alignment; 117016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_get_buffer_size: 1170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 1170361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 117046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 117056eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer( 1170661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *bufhdr) 1170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{ 1170861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int index = 0; 1170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) 1171161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->free_output_buffer(bufhdr); 1171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled && omx->is_component_secure()) 1171361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorNone; 1171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!allocated_count || !bufhdr) { 117158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr); 1171661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 1171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan index = bufhdr - m_out_mem_ptr_client; 1171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (index >= omx->drv_ctx.op_buf.actualcount) { 117208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer"); 1172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 1172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 11723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pmem_fd[index] >= 0) { 1172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan munmap(pmem_baseaddress[index], buffer_size_req); 1172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd[index]); 1172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1172761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[index] = -1; 117286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 1172961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->free_ion_memory(&op_buf_ion_info[index]); 117306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 1173161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr[index].video_heap_ptr = NULL; 1173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocated_count > 0) 1173361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count--; 1173461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 1173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count = 0; 1173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!allocated_count) { 1173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_lock(&omx->c_lock); 1173861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan c2d.close(); 1173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan init_members(); 1174061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pthread_mutex_unlock(&omx->c_lock); 1174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return omx->free_output_buffer(&omx->m_out_mem_ptr[index]); 117436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 117446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 117456eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp, 1174661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes) 117476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 1174861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 1174961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 1175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes); 1175161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 1175261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1175361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (enabled && omx->is_component_secure()) { 117548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d", 1175561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->is_component_secure()); 1175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorUnsupportedSetting; 1175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!bufferHdr || bytes > buffer_size_req) { 117598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr); 117608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("color_convert buffer_size_req %u bytes %u", 117618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)buffer_size_req, (unsigned int)bytes); 1176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorBadParameter; 1176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (allocated_count >= omx->drv_ctx.op_buf.actualcount) { 117658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert"); 1176661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 1176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL; 1176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr, 1177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan port,appData,omx->drv_ctx.op_buf.buffer_size); 1177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (eRet != OMX_ErrorNone || !temp_bufferHdr) { 117728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Buffer allocation failed color_convert"); 1177361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 1177461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if ((temp_bufferHdr - omx->m_out_mem_ptr) >= 117768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (int)omx->drv_ctx.op_buf.actualcount) { 11777f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Invalid header index %ld", 11778f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (long int)(temp_bufferHdr - omx->m_out_mem_ptr)); 1177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorUndefined; 1178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1178161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan unsigned int i = allocated_count; 117826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION 11783f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // Allocate color-conversion buffers as cached to improve software-reading 11784f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // performance of YUV (thumbnails). NOTE: These buffers will need an explicit 11785f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan // cache invalidation. 1178661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory( 1178761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan buffer_size_req,buffer_alignment_req, 1178861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data, 11789f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ION_FLAG_CACHED); 1179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd; 1179161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (op_buf_ion_info[i].ion_device_fd < 0) { 117928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert"); 1179361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 1179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1179561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req, 1179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0); 1179761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 1179861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (pmem_baseaddress[i] == MAP_FAILED) { 117998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req); 1180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan close(pmem_fd[i]); 1180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan omx->free_ion_memory(&op_buf_ion_info[i]); 1180261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return OMX_ErrorInsufficientResources; 1180361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } 1180461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_heap_ptr[i].video_heap_ptr = new VideoHeap ( 1180561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan op_buf_ion_info[i].ion_device_fd,buffer_size_req, 11806f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]); 118076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif 118088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_pmem_info_client[i].pmem_fd = (unsigned long)m_heap_ptr[i].video_heap_ptr.get(); 1180961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_pmem_info_client[i].offset = 0; 1181061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i]; 1181161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 1181261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list_client[i].nEntries = 1; 1181361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_platform_list_client[i].entryList = &m_platform_entry_client[i]; 1181461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pOutputPortPrivate = NULL; 1181561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nAllocLen = buffer_size_req; 1181661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nFilledLen = 0; 1181761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nFlags = 0; 1181861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1181961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE); 1182061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION; 1182161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i]; 1182261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i]; 1182361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan m_out_mem_ptr_client[i].pAppPrivate = appData; 1182461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan *bufferHdr = &m_out_mem_ptr_client[i]; 118258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("IL client buffer header %p", *bufferHdr); 1182661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan allocated_count++; 1182761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return eRet; 118286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 118296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 118306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::is_component_secure() 118316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 1183261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return secure_mode; 118336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 118346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal 118356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format) 118366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{ 1183761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan bool status = true; 1183861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (!enabled) { 11839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) { 118408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) 118418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan dest_color_format = (OMX_COLOR_FORMATTYPE) 118428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView; 118438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan else 11844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 11845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC){ 11846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed; 11847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else 1184861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = false; 1184961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan } else { 118508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (ColorFormat == OMX_COLOR_FormatYUV420Planar || 118518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) { 118528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan dest_color_format = ColorFormat; 11853073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava } else 118548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan status = false; 118556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal } 1185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return status; 118576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal} 11858576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 11859f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen ChavanOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::cache_ops( 11860f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan unsigned int index, unsigned int cmd) 11861f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan{ 11862f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!enabled) { 11863f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorNone; 11864f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 11865f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 11866f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!omx || index >= omx->drv_ctx.op_buf.actualcount) { 11867f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("%s: Invalid param", __func__); 11868f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorBadParameter; 11869f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 11870f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 11871f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan struct ion_flush_data flush_data; 11872f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan struct ion_custom_data custom_data; 11873f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 11874f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memset(&flush_data, 0x0, sizeof(flush_data)); 11875f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan memset(&custom_data, 0x0, sizeof(custom_data)); 11876f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 11877f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan flush_data.vaddr = pmem_baseaddress[index]; 11878f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan flush_data.fd = op_buf_ion_info[index].fd_ion_data.fd; 11879f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan flush_data.handle = op_buf_ion_info[index].fd_ion_data.handle; 11880f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan flush_data.length = buffer_size_req; 11881f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan custom_data.cmd = cmd; 11882f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan custom_data.arg = (unsigned long)&flush_data; 11883f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 11884f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("Cache %s: fd=%d handle=%d va=%p size=%d", 11885f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate", 11886f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan flush_data.fd, flush_data.handle, flush_data.vaddr, 11887f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan flush_data.length); 11888f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan int ret = ioctl(op_buf_ion_info[index].ion_device_fd, ION_IOC_CUSTOM, &custom_data); 11889f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (ret < 0) { 11890f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Cache %s failed: %s\n", 11891f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate", 11892f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan strerror(errno)); 11893f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorUndefined; 11894f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 11895f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorNone; 11896f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan} 11897f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 11898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdec::buf_ref_add(int nPortIndex) 11899576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon{ 119008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long i = 0; 11901576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon bool buf_present = false; 11902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin long fd = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 11903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 offset = drv_ctx.ptr_outputbuffer[nPortIndex].offset; 11904f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 11905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!dynamic_buf_mode || !out_dynamic_list) { 11906f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return; 11907f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 11908f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 11909576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon pthread_mutex_lock(&m_lock); 11910576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon for (i = 0; i < drv_ctx.op_buf.actualcount; i++) { 11911576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon //check the buffer fd, offset, uv addr with list contents 11912576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon //If present increment reference. 11913576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon if ((out_dynamic_list[i].fd == fd) && 11914576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon (out_dynamic_list[i].offset == offset)) { 119158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("buf_ref_add: [ALREADY PRESENT] fd = %u ref_count = %u", 119168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count); 11917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!secure_mode) { 11918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = out_dynamic_list[i].buffaddr; 11919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 11920576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon buf_present = true; 11921576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon break; 11922576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 11923576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 11924576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon if (!buf_present) { 11925576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon for (i = 0; i < drv_ctx.op_buf.actualcount; i++) { 11926576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon //search for a entry to insert details of the new buffer 11927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (out_dynamic_list[i].dup_fd < 0) { 11928576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon out_dynamic_list[i].fd = fd; 11929576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon out_dynamic_list[i].offset = offset; 11930576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon out_dynamic_list[i].dup_fd = dup(fd); 11931576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon out_dynamic_list[i].ref_count++; 119328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("buf_ref_add: [ADDED] fd = %u ref_count = %u", 119338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count); 11934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 11935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!secure_mode) { 11936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = 11937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len, 11938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin PROT_READ|PROT_WRITE, MAP_SHARED, 11939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd, 0); 11940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //mmap returns (void *)-1 on failure and sets error code in errno. 11941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr == MAP_FAILED) { 11942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("buf_ref_add: mmap failed - errno: %d", errno); 11943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = NULL; 11944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 11945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 11946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin out_dynamic_list[i].buffaddr = drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr; 11947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin out_dynamic_list[i].mapped_size = drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len; 11948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("mmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size); 11949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 11950576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon break; 11951576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 11952576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 11953576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 11954576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon pthread_mutex_unlock(&m_lock); 11955576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon} 11956576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon 11957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdec::buf_ref_remove() 11958576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon{ 119598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long i = 0; 11960f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 11961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!dynamic_buf_mode || !out_dynamic_list) { 11962f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return; 11963f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 11964f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 11965576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon pthread_mutex_lock(&m_lock); 11966576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon for (i = 0; i < drv_ctx.op_buf.actualcount; i++) { 11967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!secure_mode && out_dynamic_list[i].buffaddr && out_dynamic_list[i].mapped_size) { 11968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("munmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size); 11969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin munmap(out_dynamic_list[i].buffaddr, 11970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin out_dynamic_list[i].mapped_size); 11971576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 11972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 11973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("buf_ref_remove: [REMOVED] fd = %u ref_count = %u", 11974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count); 11975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(out_dynamic_list[i].dup_fd); 11976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin out_dynamic_list[i].dup_fd = -1; 11977576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon } 11978576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon pthread_mutex_unlock(&m_lock); 11979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 11980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (out_dynamic_list) { 11981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(out_dynamic_list); 11982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin out_dynamic_list = NULL; 11983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 11984576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon} 11985a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan 119868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _MSM8974_ 11987a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavanvoid omx_vdec::send_codec_config() { 11988a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan if (codec_config_flag) { 119898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long p1 = 0; // Parameter - 1 119908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long p2 = 0; // Parameter - 2 119918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unsigned long ident = 0; 11992a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan pthread_mutex_lock(&m_lock); 11993a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan DEBUG_PRINT_LOW("\n Check Queue for codec_config buffer \n"); 11994a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan while (m_etb_q.m_size) { 11995a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan m_etb_q.pop_entry(&p1,&p2,&ident); 11996a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 11997a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 11998a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan if (empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\ 11999a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 12000a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure"); 12001a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan omx_report_error(); 12002a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } 12003a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } else { 12004a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 12005a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 12006a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } 12007a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_ETB) { 12008a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 12009a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan if (empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 12010a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 12011a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure"); 12012a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan omx_report_error (); 12013a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } 12014a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } else { 12015a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan pending_input_buffers++; 12016a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 12017a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 12018a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 12019a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } 12020a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } else if (ident == OMX_COMPONENT_GENERATE_EBD) { 12021a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p", 12022a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan (OMX_BUFFERHEADERTYPE *)p1); 12023a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 12024a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } 12025a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } 12026a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan pthread_mutex_unlock(&m_lock); 12027a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan } 12028a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan} 120298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif 120308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 12031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_vdec::perf_control::perf_control() 120328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{ 120338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_perf_lib = NULL; 12034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_perf_handle = 0; 120358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_perf_lock_acquire = NULL; 120368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_perf_lock_release = NULL; 120378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 120388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 120398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::perf_control::~perf_control() 120408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{ 12041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_perf_handle != 0 && m_perf_lock_release) { 120428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_LOW("NOTE2: release perf lock"); 120438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_perf_lock_release(m_perf_handle); 120448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 120458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_perf_lib) { 120468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan dlclose(m_perf_lib); 120478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 120488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 120498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 12050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinstruct omx_vdec::perf_control::mpctl_stats omx_vdec::perf_control::mpctl_obj = {0, 0, 0}; 12051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 12052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_vdec::perf_lock omx_vdec::perf_control::m_perf_lock; 12053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 12054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdec::perf_control::send_hint_to_mpctl(bool state) 12055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 12056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (load_lib() == false) { 12057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return; 12058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 12059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_perf_lock.lock(); 12060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* 0x4401 maps to video decode playback hint 12061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * in perflock, enum number is 44 and state 12062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * being sent on perflock acquire is 01 (true) 12063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 12064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int arg = 0x4401; 12065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 12066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (state == true) { 12067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mpctl_obj.vid_inst_count++; 12068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (state == false) { 12069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mpctl_obj.vid_inst_count--; 12070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 12071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 12072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_perf_lock_acquire && mpctl_obj.vid_inst_count == 1 && mpctl_obj.vid_acquired == false) { 12073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mpctl_obj.vid_disp_handle = m_perf_lock_acquire(0, 0, &arg, sizeof(arg) / sizeof(int)); 12074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mpctl_obj.vid_acquired = true; 12075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_INFO("Video slvp perflock acquired"); 12076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (m_perf_lock_release && (mpctl_obj.vid_inst_count == 0 || mpctl_obj.vid_inst_count > 1) && mpctl_obj.vid_acquired == true) { 12077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_perf_lock_release(mpctl_obj.vid_disp_handle); 12078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mpctl_obj.vid_acquired = false; 12079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_INFO("Video slvp perflock released"); 12080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 12081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_perf_lock.unlock(); 12082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 12083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 120848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::perf_control::request_cores(int frame_duration_us) 120858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{ 120868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (frame_duration_us > MIN_FRAME_DURATION_FOR_PERF_REQUEST_US) { 120878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return; 120888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 12089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool retVal = load_lib(); 12090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retVal && m_perf_lock_acquire && m_perf_handle == 0) { 120918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan int arg = 0x700 /*base value*/ + 2 /*cores*/; 120928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_perf_handle = m_perf_lock_acquire(m_perf_handle, 0, &arg, sizeof(arg)/sizeof(int)); 120938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_perf_handle) { 120948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_HIGH("perf lock acquired"); 120958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 120968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 120978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 120988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 12099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdec::perf_control::load_lib() 121008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{ 121018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan char perf_lib_path[PROPERTY_VALUE_MAX] = {0}; 121028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_perf_lib) 12103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return true; 121048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 121058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if((property_get("ro.vendor.extension_library", perf_lib_path, NULL) <= 0)) { 121068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("vendor library not set in ro.vendor.extension_library"); 12107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto handle_err; 121088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 121098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan 121108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if ((m_perf_lib = dlopen(perf_lib_path, RTLD_NOW)) == NULL) { 121118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to open %s : %s",perf_lib_path, dlerror()); 12112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto handle_err; 121138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } else { 121148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_perf_lock_acquire = (perf_lock_acquire_t)dlsym(m_perf_lib, "perf_lock_acq"); 121158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_perf_lock_acquire == NULL) { 121168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_acq"); 12117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto handle_err; 121188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 121198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan m_perf_lock_release = (perf_lock_release_t)dlsym(m_perf_lib, "perf_lock_rel"); 121208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan if (m_perf_lock_release == NULL) { 121218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_rel"); 12122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto handle_err; 121238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 121248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan } 12125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return true; 12126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 12127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinhandle_err: 12128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_perf_lib) { 12129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin dlclose(m_perf_lib); 12130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 12131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_perf_lib = NULL; 12132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return false; 121338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan} 12134709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan 12135f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen ChavanOMX_ERRORTYPE omx_vdec::enable_adaptive_playback(unsigned long nMaxFrameWidth, 12136f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan unsigned long nMaxFrameHeight) 12137f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan{ 12138f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12139f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan OMX_ERRORTYPE eRet = OMX_ErrorNone; 12140f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan int ret = 0; 12141f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan unsigned long min_res_buf_count = 0; 12142f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12143f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = enable_smoothstreaming(); 12144f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (eRet != OMX_ErrorNone) { 12145f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Failed to enable Adaptive Playback on driver"); 12146f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return eRet; 12147f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 12148f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12149f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("Enabling Adaptive playback for %lu x %lu", 12150f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan nMaxFrameWidth, 12151f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan nMaxFrameHeight); 12152f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_smoothstreaming_mode = true; 12153f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_smoothstreaming_width = nMaxFrameWidth; 12154f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_smoothstreaming_height = nMaxFrameHeight; 12155f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12156f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan //Get upper limit buffer count for min supported resolution 12157f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan struct v4l2_format fmt; 12158f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 12159f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.fmt.pix_mp.height = m_decoder_capability.min_height; 12160f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.fmt.pix_mp.width = m_decoder_capability.min_width; 12161f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 12162f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12163f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 12164f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (ret) { 12165f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Set Resolution failed for HxW = %ux%u", 12166f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_decoder_capability.min_height, 12167f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_decoder_capability.min_width); 12168f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorUnsupportedSetting; 12169f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 12170f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12171f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 12172f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (eRet != OMX_ErrorNone) { 12173f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("failed to get_buffer_req"); 12174f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return eRet; 12175f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 12176f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12177f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan min_res_buf_count = drv_ctx.op_buf.mincount; 12178f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("enable adaptive - upper limit buffer count = %lu for HxW %ux%u", 12179f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan min_res_buf_count, m_decoder_capability.min_height, m_decoder_capability.min_width); 12180f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12181f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan update_resolution(m_smoothstreaming_width, m_smoothstreaming_height, 12182f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan m_smoothstreaming_width, m_smoothstreaming_height); 12183f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = is_video_session_supported(); 12184f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (eRet != OMX_ErrorNone) { 12185f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("video session is not supported"); 12186f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return eRet; 12187f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 12188f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12189f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan //Get upper limit buffer size for max smooth streaming resolution set 12190f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 12191f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 12192f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 12193f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan fmt.fmt.pix_mp.pixelformat = output_capability; 12194f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 12195f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (ret) { 12196f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("Set Resolution failed for adaptive playback"); 12197f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorUnsupportedSetting; 12198f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 12199f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12200f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 12201f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (eRet != OMX_ErrorNone) { 12202f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("failed to get_buffer_req!!"); 12203f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return eRet; 12204f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 12205f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_LOW("enable adaptive - upper limit buffer size = %u", 12206f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan (unsigned int)drv_ctx.op_buf.buffer_size); 12207f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12208f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan drv_ctx.op_buf.mincount = min_res_buf_count; 12209f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan drv_ctx.op_buf.actualcount = min_res_buf_count; 12210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.buffer_size = drv_ctx.op_buf.buffer_size; 12211f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = set_buffer_req(&drv_ctx.op_buf); 12212f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (eRet != OMX_ErrorNone) { 12213f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("failed to set_buffer_req"); 12214f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return eRet; 12215f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 12216f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12217f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan eRet = get_buffer_req(&drv_ctx.op_buf); 12218f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (eRet != OMX_ErrorNone) { 12219f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_ERROR("failed to get_buffer_req!!!"); 12220f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return eRet; 12221f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } 12222f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DEBUG_PRINT_HIGH("adaptive playback enabled, buf count = %u bufsize = %u", 12223f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan drv_ctx.op_buf.mincount, (unsigned int)drv_ctx.op_buf.buffer_size); 12224f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return eRet; 12225f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan} 12226709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan 12227709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan//static 12228f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen ChavanOMX_ERRORTYPE omx_vdec::describeColorFormat(OMX_PTR pParam) { 12229f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12230f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifndef FLEXYUV_SUPPORTED 12231f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan return OMX_ErrorUndefined; 12232f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#else 12233f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12234f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (pParam == NULL) { 12235709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan DEBUG_PRINT_ERROR("describeColorFormat: invalid params"); 12236709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan return OMX_ErrorBadParameter; 12237709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan } 12238709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan 12239f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan DescribeColorFormatParams *params = (DescribeColorFormatParams*)pParam; 12240f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan 12241709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan MediaImage *img = &(params->sMediaImage); 12242709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan switch(params->eColorFormat) { 12243709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m: 12244709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan { 12245709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mType = MediaImage::MEDIA_IMAGE_TYPE_YUV; 12246709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mNumPlanes = 3; 12247709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan // mWidth and mHeight represent the W x H of the largest plane 12248709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan // In our case, this happens to be the Stride x Scanlines of Y plane 12249709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mWidth = params->nFrameWidth; 12250709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mHeight = params->nFrameHeight; 12251709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan size_t planeWidth = VENUS_Y_STRIDE(COLOR_FMT_NV12, params->nFrameWidth); 12252709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan size_t planeHeight = VENUS_Y_SCANLINES(COLOR_FMT_NV12, params->nFrameHeight); 12253709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mBitDepth = 8; 12254709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan //Plane 0 (Y) 12255709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::Y].mOffset = 0; 12256709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::Y].mColInc = 1; 12257709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::Y].mRowInc = planeWidth; //same as stride 12258709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::Y].mHorizSubsampling = 1; 12259709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::Y].mVertSubsampling = 1; 12260709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan //Plane 1 (U) 12261709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::U].mOffset = planeWidth * planeHeight; 12262709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::U].mColInc = 2; //interleaved UV 12263709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::U].mRowInc = 12264709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth); 12265709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::U].mHorizSubsampling = 2; 12266709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::U].mVertSubsampling = 2; 12267709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan //Plane 2 (V) 12268709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::V].mOffset = planeWidth * planeHeight + 1; 12269709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::V].mColInc = 2; //interleaved UV 12270709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::V].mRowInc = 12271709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth); 12272709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::V].mHorizSubsampling = 2; 12273709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mPlane[MediaImage::V].mVertSubsampling = 2; 12274709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan break; 12275709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan } 12276709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan 12277709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan case OMX_COLOR_FormatYUV420Planar: 12278709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan case OMX_COLOR_FormatYUV420SemiPlanar: 12279709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan // We need not describe the standard OMX linear formats as these are 12280709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan // understood by client. Fail this deliberately to let client fill-in 12281709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan return OMX_ErrorUnsupportedSetting; 12282709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan 12283709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan default: 12284709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan // Rest all formats which are non-linear cannot be described 12285709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan DEBUG_PRINT_LOW("color-format %x is not flexible", params->eColorFormat); 12286709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan img->mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 12287709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan return OMX_ErrorNone; 12288709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan }; 12289709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan 12290709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan DEBUG_PRINT_LOW("NOTE: Describe color format : %x", params->eColorFormat); 12291709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan DEBUG_PRINT_LOW(" FrameWidth x FrameHeight : %d x %d", params->nFrameWidth, params->nFrameHeight); 12292709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan DEBUG_PRINT_LOW(" YWidth x YHeight : %d x %d", img->mWidth, img->mHeight); 12293709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan for (size_t i = 0; i < img->mNumPlanes; ++i) { 12294ce256dab580d6601e34cf59642f642bd496952aePatrick Tjin DEBUG_PRINT_LOW(" Plane[%zd] : offset=%d / xStep=%d / yStep = %d", 12295709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan i, img->mPlane[i].mOffset, img->mPlane[i].mColInc, img->mPlane[i].mRowInc); 12296709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan } 12297709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan return OMX_ErrorNone; 12298f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif //FLEXYUV_SUPPORTED 12299709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan} 12300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 12301bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetschvoid omx_vdec::prefetchNewBuffers() { 12302bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12303bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch struct v4l2_decoder_cmd dec; 12304bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch uint32_t prefetch_count; 12305bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch uint32_t prefetch_size; 12306bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch uint32_t want_size; 12307bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch uint32_t have_size; 12308bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch int color_fmt, rc; 12309bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch uint32_t new_calculated_size; 12310bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch uint32_t new_buffer_size; 12311bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch uint32_t new_buffer_count; 12312bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch uint32_t old_buffer_size; 12313bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch uint32_t old_buffer_count; 12314bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12315bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch memset((void *)&dec, 0 , sizeof(dec)); 12316bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch DEBUG_PRINT_LOW("Old size : %d, count : %d, width : %u, height : %u\n", 12317bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch (int)drv_ctx.op_buf.buffer_size, drv_ctx.op_buf.actualcount, 12318bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch drv_ctx.video_resolution.frame_width, 12319bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch drv_ctx.video_resolution.frame_height); 12320bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch dec.cmd = V4L2_DEC_QCOM_CMD_RECONFIG_HINT; 12321bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 12322bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch DEBUG_PRINT_ERROR("Buffer info cmd failed : %d\n", errno); 12323bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch } else { 12324bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch DEBUG_PRINT_LOW("From driver, new size is %d, count is %d\n", 12325bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch dec.raw.data[0], dec.raw.data[1]); 12326bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch } 12327bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12328bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch switch ((int)drv_ctx.output_format) { 12329bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch case VDEC_YUV_FORMAT_NV12: 12330bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch color_fmt = COLOR_FMT_NV12; 12331bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch break; 12332bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch case VDEC_YUV_FORMAT_NV12_UBWC: 12333bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch color_fmt = COLOR_FMT_NV12_UBWC; 12334bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch break; 12335bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch default: 12336bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch color_fmt = -1; 12337bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch } 12338bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12339bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch new_calculated_size = VENUS_BUFFER_SIZE(color_fmt, m_reconfig_width, m_reconfig_height); 12340bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch DEBUG_PRINT_LOW("New calculated size for width : %d, height : %d, is %d\n", 12341bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch m_reconfig_width, m_reconfig_height, new_calculated_size); 12342bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch new_buffer_size = (dec.raw.data[0] > new_calculated_size) ? dec.raw.data[0] : new_calculated_size; 12343bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch new_buffer_count = dec.raw.data[1]; 12344bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch old_buffer_size = drv_ctx.op_buf.buffer_size; 12345bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch old_buffer_count = drv_ctx.op_buf.actualcount; 12346bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12347bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch new_buffer_count = old_buffer_count > new_buffer_count ? old_buffer_count : new_buffer_count; 12348bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12349bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch prefetch_count = new_buffer_count; 12350bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch prefetch_size = new_buffer_size - old_buffer_size; 12351bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch want_size = new_buffer_size * new_buffer_count; 12352bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch have_size = old_buffer_size * old_buffer_count; 12353bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12354bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch if (want_size > have_size) { 12355bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch DEBUG_PRINT_LOW("Want: %d, have : %d\n", want_size, have_size); 12356bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch DEBUG_PRINT_LOW("prefetch_count: %d, prefetch_size : %d\n", prefetch_count, prefetch_size); 12357bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12358bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch int ion_fd = open(MEM_DEVICE, O_RDONLY); 12359bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch if (ion_fd < 0) { 12360bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch DEBUG_PRINT_ERROR("Ion fd open failed : %d\n", ion_fd); 12361bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch return; 12362bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch } 12363bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12364bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch struct ion_custom_data *custom_data = (struct ion_custom_data*) malloc(sizeof(*custom_data)); 12365bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch struct ion_prefetch_data *prefetch_data = (struct ion_prefetch_data*) malloc(sizeof(*prefetch_data)); 12366bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch struct ion_prefetch_regions *regions = (struct ion_prefetch_regions*) malloc(sizeof(*regions)); 12367bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch size_t *sizes = (size_t*) malloc(sizeof(size_t) * prefetch_count); 12368bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12369bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch if (custom_data == NULL || prefetch_data == NULL || regions == NULL || sizes == NULL) { 12370bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch DEBUG_PRINT_ERROR("prefetch data allocation failed"); 12371bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch goto prefetch_exit; 12372bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch } 12373bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12374bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch for (uint32_t i = 0; i < prefetch_count; i++) { 12375bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch sizes[i] = prefetch_size; 12376bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch } 12377bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12378bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch regions[0].nr_sizes = prefetch_count; 12379bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch regions[0].sizes = sizes; 12380bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch regions[0].vmid = ION_FLAG_CP_PIXEL; 12381bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12382bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch prefetch_data->nr_regions = 1; 12383bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch prefetch_data->regions = regions; 12384bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch prefetch_data->heap_id = ION_HEAP(ION_SECURE_HEAP_ID); 12385bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12386bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch custom_data->cmd = ION_IOC_PREFETCH; 12387bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch custom_data->arg = (unsigned long )prefetch_data; 12388bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12389bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch rc = ioctl(ion_fd, ION_IOC_CUSTOM, custom_data); 12390bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch if (rc) { 12391bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch DEBUG_PRINT_ERROR("Custom prefetch ioctl failed rc : %d, errno : %d\n", rc, errno); 12392bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch } 12393bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 12394bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetschprefetch_exit: 12395bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch close(ion_fd); 12396bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch free(sizes); 12397bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch free(regions); 12398bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch free(prefetch_data); 12399bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch free(custom_data); 12400bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch } 12401bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch} 12402bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch 124037ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan// No code beyond this ! 124047ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan 124057ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan// inline import of vendor-extensions implementation 124067ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan#include "omx_vdec_extensions.hpp" 12407