111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*-------------------------------------------------------------------------- 211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCopyright (c) 2010 - 2016, The Linux Foundation. All rights reserved. 311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRedistribution and use in source and binary forms, with or without 511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelmodification, are permitted provided that the following conditions are met: 611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Redistributions of source code must retain the above copyright 711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel notice, this list of conditions and the following disclaimer. 811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Redistributions in binary form must reproduce the above copyright 911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel notice, this list of conditions and the following disclaimer in the 1011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel documentation and/or other materials provided with the distribution. 1111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Neither the name of The Linux Foundation nor 1211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel the names of its contributors may be used to endorse or promote 1311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel products derived from this software without specific prior written 1411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel permission. 1511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 1911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel--------------------------------------------------------------------------*/ 2811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*============================================================================ 3011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel O p e n M A X w r a p p e r s 3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel O p e n M A X C o r e 3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel This module contains the implementation of the OpenMAX core & component. 3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel*//*========================================================================*/ 3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel////////////////////////////////////////////////////////////////////////////// 3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Include Files 3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel////////////////////////////////////////////////////////////////////////////// 4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define __STDC_FORMAT_MACROS 4211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <inttypes.h> 4311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <string.h> 4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <pthread.h> 4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/prctl.h> 4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <stdlib.h> 4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <unistd.h> 4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <errno.h> 5011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "omx_vdec.h" 5111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <fcntl.h> 5211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <limits.h> 5311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <stdlib.h> 5411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h> 5511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/msm_media_info.h> 5611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/eventfd.h> 5711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef _ANDROID_ 5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/ioctl.h> 6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/mman.h> 6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //_ANDROID_ 6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <cutils/properties.h> 6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#undef USE_EGL_IMAGE_GPU 6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <qdMetaData.h> 6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <gralloc_priv.h> 7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ANDROID_JELLYBEAN_MR2 7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "QComOMXMetadata.h" 7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU 7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <EGL/egl.h> 7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <EGL/eglQCOM.h> 7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EGL_BUFFER_HANDLE 0x4F00 7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EGL_BUFFER_OFFSET 0x4F01 8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BUFFER_LOG_LOC "/data/misc/media" 8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG 8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFILE *outputExtradataFile; 8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelchar output_extradata_filename [] = "/data/misc/media/extradata"; 8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_FPS 30 9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX_SUPPORTED_FPS 240 9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_WIDTH_ALIGNMENT 128 9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_HEIGHT_ALIGNMENT 32 9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SP_MP_START_CODE 0xC5000000 9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SP_MP_START_CODE_MASK 0xFF000000 9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_AP_SEQ_START_CODE 0x0F010000 9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_C_PROFILE_MASK 0xF0 9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_B_LEVEL_MASK 0xE0000000 9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SIMPLE_PROFILE 0 10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_MAIN_PROFILE 1 10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_ADVANCE_PROFILE 3 10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SIMPLE_PROFILE_LOW_LEVEL 0 10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SIMPLE_PROFILE_MED_LEVEL 2 10411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_C_LEN 4 10511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_C_POS 8 10611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_A_POS 12 10711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_B_POS 24 10811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SEQ_LAYER_SIZE 36 10911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define POLL_TIMEOUT 0x7fffffff 11011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_DEVICE "/dev/ion" 11211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 11411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelextern "C" { 11511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include<utils/Log.h> 11611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 11711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif//_ANDROID_ 11811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_4K 0x1000 12011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_1M 0x100000 12111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } } 12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); } 12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EXTRADATA_IDX(__num_planes) ((__num_planes) ? (__num_planes) - 1 : 0) 12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ALIGN(x, to_align) ((((unsigned) x) + (to_align - 1)) & ~(to_align - 1)) 12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 127fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA | OMX_FRAMEPACK_EXTRADATA | OMX_OUTPUTCROP_EXTRADATA \ 128fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel | OMX_DISPLAY_INFO_EXTRADATA | OMX_HDR_COLOR_INFO_EXTRADATA) 12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_CONCEAL_COLOR "32784" //0x8010, black by default 13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef ION_FLAG_CP_BITSTREAM 13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ION_FLAG_CP_BITSTREAM 0 13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef ION_FLAG_CP_PIXEL 13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ION_FLAG_CP_PIXEL 0 13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef MASTER_SIDE_CP 14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_HEAP_ID ION_SECURE_HEAP_ID 14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_ALIGN SZ_4K 14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_INPUT_BUFFER (ION_SECURE | ION_FLAG_CP_BITSTREAM) 14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_OUTPUT_BUFFER (ION_SECURE | ION_FLAG_CP_PIXEL) 14411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else //SLAVE_SIDE_CP 14511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_HEAP_ID ION_CP_MM_HEAP_ID 14611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_ALIGN SZ_1M 14711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_INPUT_BUFFER ION_SECURE 14811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_OUTPUT_BUFFER ION_SECURE 14911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 15011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 151af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel#define LUMINANCE_DIV_FACTOR 10000.0 152af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel 15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_U32 maxSmoothStreamingWidth = 1920; 15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_U32 maxSmoothStreamingHeight = 1088; 15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 15611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* async_message_thread (void *input) 15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *buffer; 15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pollfd pfds[2]; 16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer v4l2_buf; 16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event dqevent; 16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec *omx = reinterpret_cast<omx_vdec*>(input); 16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfds[0].events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfds[1].events = POLLIN | POLLERR; 16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfds[0].fd = omx->drv_ctx.video_driver_fd; 16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfds[1].fd = omx->m_poll_efd; 16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0; 17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdec: Async thread start"); 17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0); 17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (!omx->async_thread_force_stop) { 17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = poll(pfds, 2, POLL_TIMEOUT); 17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!rc) { 17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Poll timedout"); 17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (rc < 0 && errno != EINTR && errno != EAGAIN) { 17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error while polling: %d, errno = %d", rc, errno); 17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pfds[1].revents & POLLIN) || (pfds[1].revents & POLLERR)) { 18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread interrupted to be exited"); 18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pfds[0].revents & POLLIN) || (pfds[0].revents & POLLRDNORM)) { 18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&vdec_msg, 0, sizeof(vdec_msg)); 18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 18911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.memory = V4L2_MEMORY_USERPTR; 19011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.length = omx->drv_ctx.num_planes; 19111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.m.planes = plane; 19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) { 19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE; 19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf; 19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.len=plane[0].bytesused; 19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr; 19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) + 19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (uint64_t)v4l2_buf.timestamp.tv_usec; 20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 20211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 20311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 20411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 20511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 20611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 20711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pfds[0].revents & POLLOUT) || (pfds[0].revents & POLLWRNORM)) { 20811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 20911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.memory = V4L2_MEMORY_USERPTR; 21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.length = 1; 21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.m.planes = plane; 21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) { 21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE; 21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf; 21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pfds[0].revents & POLLPRI) { 22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(pfds[0].fd, VIDIOC_DQEVENT, &dqevent); 22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) { 22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data; 22811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 22911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED; 23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.picsize.frame_height = ptr[0]; 23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.picsize.frame_width = ptr[1]; 23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDC Port Reconfig received insufficient"); 23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ptr[2] & V4L2_EVENT_BITDEPTH_FLAG) { 23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->dpb_bit_depth = ptr[3]; 23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDC Port Reconfig Bitdepth change - %d", ptr[3]); 23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ptr[2] & V4L2_EVENT_PICSTRUCT_FLAG) { 23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->m_progressive = ptr[4]; 24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDC Port Reconfig PicStruct change - %d", ptr[4]); 24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 242af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel if(ptr[2] & V4L2_EVENT_COLOUR_SPACE_FLAG) { 243af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel if (ptr[5] == MSM_VIDC_BT2020) { 244af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel omx->m_color_space = omx_vdec::BT2020; 245af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } else { 246af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel omx->m_color_space = omx_vdec::EXCEPT_BT2020; 247af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } 248af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel DEBUG_PRINT_HIGH("VIDC Port Reconfig ColorSpace change - %d", omx->m_color_space); 249af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } 25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 25311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 25411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) { 25511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 25611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE; 25711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 25811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved"); 25911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 26011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 26111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 26211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 26311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE; 26411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 26511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved"); 26611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 26711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 26811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 26911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 27011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_OVERLOAD) { 27111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_EVT_HW_OVERLOAD; 27311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 27411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("HW Overload received"); 27511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 27611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 27711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 27811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 27911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED) { 28011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 28111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_EVT_HW_UNSUPPORTED; 28211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 28311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("HW Unsupported received"); 28411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 28511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 28611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 28711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 28811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) { 28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 29011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode = VDEC_MSG_EVT_HW_ERROR; 29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code = VDEC_S_SUCCESS; 29211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("SYS Error Recieved"); 29311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE) { 29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data; 29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 30011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("REFERENCE RELEASE EVENT RECVD fd = %d offset = %d", ptr[0], ptr[1]); 30111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER) { 30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data; 30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Release unqueued buffer event recvd fd = %d offset = %d", ptr[0], ptr[1]); 30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.memory = V4L2_MEMORY_USERPTR; 30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.length = omx->drv_ctx.num_planes; 31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.m.planes = plane; 31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.index = ptr[5]; 31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.flags = 0; 31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode = VDEC_MSG_RESP_OUTPUT_BUFFER_DONE; 31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code = VDEC_S_SUCCESS; 31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.client_data = (void*)&v4l2_buf; 31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.len = 0; 31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.bufferaddr = (void*)(intptr_t)ptr[2]; 31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.time_stamp = ((uint64_t)ptr[3] * (uint64_t)1000000) + 32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (uint64_t)ptr[4]; 32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exitedn"); 32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 32611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDC Some Event recieved"); 32711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdec: Async thread stop"); 33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* message_thread_dec(void *input) 33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec* omx = reinterpret_cast<omx_vdec*>(input); 33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char id; 33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int n; 34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd_set readFds; 34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int res = 0; 34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct timeval tv; 34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdec: message thread start"); 34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0); 34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (!omx->message_thread_stop) { 34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tv.tv_sec = 2; 35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tv.tv_usec = 0; 35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FD_ZERO(&readFds); 35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FD_SET(omx->m_pipe_in, &readFds); 35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel res = select(omx->m_pipe_in + 1, &readFds, NULL, NULL, &tv); 35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (res < 0) { 35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("select() ERROR: %s", strerror(errno)); 35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (res == 0 /*timeout*/ || omx->message_thread_stop) { 36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel n = read(omx->m_pipe_in, &id, 1); 36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == n) { 36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 36911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (1 == n) { 37011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->process_event_cb(omx, id); 37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((n < 0) && (errno != EINTR)) { 37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno); 37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdec: message thread stop"); 37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid post_message(omx_vdec *omx, unsigned char id) 38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret_value; 38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out); 38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret_value = write(omx->m_pipe_out, &id, 1); 38711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret_value <= 0) { 38811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("post_message to pipe failed : %s", strerror(errno)); 38911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 39011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value); 39111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 39211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx_cmd_queue destructor 39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_cmd_queue::~omx_cmd_queue() 39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Nothing to do 39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue constructor 40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0) 40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE); 40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue insert 40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::omx_cmd_queue::insert_entry(unsigned long p1, unsigned long p2, unsigned long id) 40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) { 41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_q[m_write].id = id; 41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_q[m_write].param1 = p1; 41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_q[m_write].param2 = p2; 41411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_write++; 41511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_size ++; 41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) { 41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_write = 0; 41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__); 42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue pop 42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::omx_cmd_queue::pop_entry(unsigned long *p1, unsigned long *p2, unsigned long *id) 42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_size > 0) { 43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *id = m_q[m_read].id; 43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p1 = m_q[m_read].param1; 43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p2 = m_q[m_read].param2; 43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Move the read pointer ahead 43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ++m_read; 43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel --m_size; 43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) { 43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_read = 0; 43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 44111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 44211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 44311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 44411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 44511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 44611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Retrieve the first mesg type in the queue 44711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned omx_vdec::omx_cmd_queue::get_q_msg_type() 44811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return m_q[m_read].id; 45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::ts_arr_list::ts_arr_list() 45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //initialize timestamps array 45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) ); 45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::ts_arr_list::~ts_arr_list() 45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //free m_ts_arr_list? 46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts) 46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool duplicate_ts = false; 46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int idx = 0; 46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //insert at the first available empty location 47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_ts_arr_list[idx].valid) { 47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //found invalid or empty entry, save timestamp 47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ts_arr_list[idx].valid = true; 47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ts_arr_list[idx].timestamp = ts; 47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)", 47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts, idx); 47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 47811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) { 48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert"); 48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 48611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 48711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 48811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts) 48911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 49011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 49111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int min_idx = -1; 49211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TICKS min_ts = 0; 49311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int idx = 0; 49411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 49511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 49611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 49711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_ts_arr_list[idx].valid) { 49811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //found valid entry, save index 49911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (min_idx < 0) { 50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //first valid entry 50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_ts = m_ts_arr_list[idx].timestamp; 50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_idx = idx; 50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_ts_arr_list[idx].timestamp < min_ts) { 50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_ts = m_ts_arr_list[idx].timestamp; 50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_idx = idx; 50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (min_idx < 0) { 51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //no valid entries found 51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop"); 51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts = 0; 51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts = m_ts_arr_list[min_idx].timestamp; 51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ts_arr_list[min_idx].valid = false; 51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)", 52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts, min_idx); 52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::reset_ts_list() 52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int idx = 0; 53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list"); 53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ts_arr_list[idx].valid = false; 53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// factory function executed by the core to create instances 54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid *get_omx_component_factory_fn(void) 54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return (new omx_vdec); 54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelVideoHeap::VideoHeap(int devicefd, size_t size, void* base, 55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_user_handle_t handle, int ionMapfd) 55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) devicefd; 55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) size; 55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) base; 55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) handle; 55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) ionMapfd; 55711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd); 55811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 55911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 56011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelVideoHeap::VideoHeap(int fd, size_t size, void* base) 56111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 56211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // dup file descriptor, map once, use pmem 56311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel init(dup(fd), base, size, 0 , MEM_DEVICE); 56411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 56511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 56611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // _ANDROID_ 567b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 568b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelbool is_platform_tp10capture_supported() 569b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel{ 570b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel char platform_name[PROPERTY_VALUE_MAX] = {0}; 571b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel property_get("ro.board.platform", platform_name, "0"); 572af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel if (!strncmp(platform_name, "msm8998", 9)) { 573b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_HIGH("TP10 on capture port is supported"); 574b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return true; 575b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 576b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_HIGH("TP10 on capture port is not supported"); 577b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return false; 578b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel} 579b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 58011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 58111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 58211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::omx_vdec 58311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 58411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 58511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Constructor 58611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 58711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 58811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None 58911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 59011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 59111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 59211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 59311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_vdec(): m_error_propogated(false), 59411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state(OMX_StateInvalid), 59511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data(NULL), 59611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr(NULL), 59711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr(NULL), 59811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress (false), 59911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress (false), 60011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer (false), 60111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_use_buffer (false), 60211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ouput_egl_buffers(false), 60311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_output_pmem(OMX_FALSE), 60411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_region_smi(OMX_FALSE), 60511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_pvt_entry_pmem(OMX_FALSE), 60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers(0), 60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers(0), 60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count(0), 60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bm_count(0), 61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bPopulated(OMX_FALSE), 61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bPopulated(OMX_FALSE), 61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_flags(0), 61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_heap_ptr(NULL), 61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bEnabled(OMX_TRUE), 61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bEnabled(OMX_TRUE), 61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_in_alloc_cnt(0), 61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list(NULL), 62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_entry(NULL), 62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info(NULL), 62211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser(NULL), 62311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes (true), 62411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame (NULL), 62511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame (NULL), 62611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr (NULL), 62711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr(NULL), 62811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_heap_inp_bm_count (0), 62911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse ((codec_type)0), 63011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel first_frame_meta (true), 63111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count (0), 63211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count (0), 63311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_length(0), 63411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal (false), 63511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel first_frame(0), 63611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel first_buffer(NULL), 63711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel first_frame_size (0), 63811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_device_file_ptr(NULL), 63911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_vc1_profile((vc1_profile_type)0), 64011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts(LLONG_MAX), 64111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_flags(0), 64211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disp_hor_size(0), 64311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disp_vert_size(0), 64411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts(LLONG_MAX), 64511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts_actual(LLONG_MAX), 64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts(true), 64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int(0), 648fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_fps_received(0), 649fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_fps_prev(0), 650fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_drc_enable(0), 65111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel in_reconfig(false), 65211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_display_id(NULL), 65311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata(0), 65411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_reject_avc_1080p_mp (0), 65511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 65611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_enable_android_native_buffers(OMX_FALSE), 65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_android_native_buffers(OMX_FALSE), 65811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_desc_buffer_ptr(NULL), 66011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode(false), 66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocate_native_handle(false), 66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_other_extradata(NULL), 66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile(0), 66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_set_fps(false), 66511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stereo_output_mode(HAL_NO_3D), 66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_last_rendered_TS(-1), 66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queued_codec_config_count(0), 66811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel current_perf_level(V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL), 66911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_scaling_to_non_secure_opb(false), 670b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel m_force_compressed_for_dpb(true), 67111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_is_display_session(false) 67211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 67311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_in = -1; 67411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_out = -1; 67511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_poll_efd = -1; 67611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_driver_fd = -1; 67711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.ion.fd_ion_data.fd = -1; 67811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Assumption is that , to begin with , we have all the frames with decoder */ 67911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("In %u bit OMX vdec Constructor", (unsigned int)sizeof(long) * 8); 68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_debug,0,sizeof(m_debug)); 68111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char property_value[PROPERTY_VALUE_MAX] = {0}; 68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.debug.level", property_value, "1"); 684b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel debug_level = strtoul(property_value, NULL, 16); 68511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 68611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 68711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("In OMX vdec Constructor"); 68811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 68911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.perf", property_value, "0"); 69011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel perf_flag = atoi(property_value); 69111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (perf_flag) { 69211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag); 69311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec_time.start(); 69411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 695fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel proc_frms = latency = 0; 69611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_n_filled_len = 0; 69711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 69811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.ts", property_value, "0"); 69911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug_timestamp = atoi(property_value); 70011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp); 70111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_timestamp) { 70211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.set_timestamp_reorder_mode(true); 70311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.enable_debug_print(true); 70411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 70511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 70611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 70711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.concealedmb", property_value, "0"); 70811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug_concealedmb = atoi(property_value); 70911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb); 71011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 71111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 71211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.profile.check", property_value, "0"); 71311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_reject_avc_1080p_mp = atoi(property_value); 71411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("vidc.dec.profile.check value is %d",m_reject_avc_1080p_mp); 71511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 71611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 71711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.log.in", property_value, "0"); 71811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.in_buffer_log = atoi(property_value); 71911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 72111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.log.out", property_value, "0"); 72211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_buffer_log = atoi(property_value); 72311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC); 72411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 72611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.meta.log.out", property_value, "0"); 72711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_meta_buffer_log = atoi(property_value); 72811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC); 72911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 73111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.log.loc", property_value, ""); 73211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*property_value) 73311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(m_debug.log_loc, property_value, PROPERTY_VALUE_MAX); 73411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 73611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.120fps.enabled", property_value, "0"); 73711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //if this feature is not enabled then reset this value -ve 73911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(atoi(property_value)) { 74011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("feature 120 FPS decode enabled"); 74111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_last_rendered_TS = 0; 74211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 74311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 74411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 74511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.dyn.disabled", property_value, "0"); 74611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disable_dynamic_buf_mode = atoi(property_value); 74711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("vidc.dec.debug.dyn.disabled value is %d",m_disable_dynamic_buf_mode); 74811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 749fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel property_value[0] = '\0'; 750fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel property_get("vidc.dec.drc.enable", property_value, "0"); 751fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (atoi(property_value)) { 752fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_drc_enable = true; 753fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_HIGH("DRC enabled"); 754fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 755fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 75611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _UBWC_ 75711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 75811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("debug.gralloc.gfx_ubwc_disable", property_value, "0"); 75911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disable_ubwc_mode = atoi(property_value); 76011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("UBWC mode is %s", m_disable_ubwc_mode ? "disabled" : "enabled"); 76111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 76211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disable_ubwc_mode = true; 76311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 76411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 76511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_cmp,0,sizeof(m_cmp)); 76611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_cb,0,sizeof(m_cb)); 76711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset (&drv_ctx,0,sizeof(drv_ctx)); 76811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE)); 76911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset (m_hwdevice_name,0,sizeof(m_hwdevice_name)); 77011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 77111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_custom_buffersize, 0, sizeof(m_custom_buffersize)); 772fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset(&m_client_color_space, 0, sizeof(DescribeColorAspectsParams)); 773fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset(&m_internal_color_space, 0, sizeof(DescribeColorAspectsParams)); 774fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel memset(&m_client_hdr_info, 0, sizeof(DescribeHDRStaticInfoParams)); 775fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel memset(&m_internal_hdr_info, 0, sizeof(DescribeHDRStaticInfoParams)); 77611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_entries = 0; 77711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_id = 0; 77811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_id = 0; 77911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_created = false; 78011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_created = false; 78111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_force_stop = false; 78211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel message_thread_stop = false; 78311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 78411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 78511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 78611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info)); 78711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 78811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* invalidate m_frame_pack_arrangement */ 78911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_frame_pack_arrangement, 0, sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT)); 79011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_pack_arrangement.cancel_flag = 1; 79111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 79211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.timestamp_adjust = false; 79311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_vendor_config.pData = NULL; 79411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(&m_lock, NULL); 79511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(&c_lock, NULL); 79611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(&buf_lock, NULL); 79711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_init(&m_cmd_lock,0,0); 79811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_init(&m_safe_flush, 0, 0); 79911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = 80011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[OUTPUT_PORT] = false; 80111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 80211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char extradata_value[PROPERTY_VALUE_MAX] = {0}; 80311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.extradata", extradata_value, "0"); 80411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug_extradata = atoi(extradata_value); 80511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata); 80611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 80711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB; 80811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_buffers.set_vdec_client(this); 80911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dynamic_buf_mode = false; 81011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list = NULL; 81111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_down_scalar_enabled = false; 81211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_width = 0; 81311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_height = 0; 81411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_force_down_scalar = 0; 81511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_reconfig_height = 0; 81611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_reconfig_width = 0; 81711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_mode = false; 81811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_width = 0; 81911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_height = 0; 82011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_q6_platform = false; 82111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_control.send_hint_to_mpctl(true); 82211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pass_buffer_fd = false; 82311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_extradata_info, 0, sizeof(m_extradata_info)); 824fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_client_color_space.nPortIndex = (OMX_U32)OMX_CORE_INPUT_PORT_INDEX; 825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_client_color_space.sAspects.mRange = ColorAspects::RangeUnspecified; 826fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_client_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified; 827fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_client_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified; 828fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_client_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified; 829fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 830fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX; 831fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mRange = ColorAspects::RangeUnspecified; 832fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified; 833fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified; 834fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified; 835fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.nSize = sizeof(DescribeColorAspectsParams); 836fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 837fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_client_hdr_info.nPortIndex = (OMX_U32)OMX_CORE_INPUT_PORT_INDEX; 838fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_internal_hdr_info.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX; 839fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_change_client_hdr_info = false; 840fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel pthread_mutex_init(&m_hdr_info_client_lock, NULL); 841af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel 842af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel char dither_value[PROPERTY_VALUE_MAX] = {0}; 843af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel property_get("vidc.dec.dither", dither_value, "0"); 844af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel if ((atoi(dither_value) > DITHER_ALL_COLORSPACE) || 845af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel (atoi(dither_value) < DITHER_DISABLE)) { 846af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel m_dither_config = DITHER_ALL_COLORSPACE; 847af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } else { 848af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel m_dither_config = is_platform_tp10capture_supported() ? (dither_type)atoi(dither_value) : DITHER_ALL_COLORSPACE; 849af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } 850af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel 851af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel DEBUG_PRINT_HIGH("Dither config is %d", m_dither_config); 852b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel m_color_space = EXCEPT_BT2020; 85311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 85411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 85511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const int event_type[] = { 85611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_FLUSH_DONE, 85711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT, 85811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT, 85911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_BITDEPTH_CHANGED_INSUFFICIENT, 86011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE, 86111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER, 86211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_SYS_ERROR, 86311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_HW_OVERLOAD, 86411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED 86511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}; 86611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 86711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE subscribe_to_events(int fd) 86811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 86911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 87011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event_subscription sub; 87111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int array_sz = sizeof(event_type)/sizeof(int); 87211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int i,rc; 87311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 87411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid input: %d", fd); 87511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 87611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 87711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 87811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < array_sz; ++i) { 87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sub, 0, sizeof(sub)); 88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sub.type = event_type[i]; 88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type); 88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < array_sz) { 88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (--i; i >=0 ; i--) { 88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sub, 0, sizeof(sub)); 89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sub.type = event_type[i]; 89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 89411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 89511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNotImplemented; 89611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 89711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 89811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 89911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 90011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 90111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE unsubscribe_to_events(int fd) 90211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 90311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 90411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event_subscription sub; 90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int array_sz = sizeof(event_type)/sizeof(int); 90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int i,rc; 90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid input: %d", fd); 90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < array_sz; ++i) { 91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sub, 0, sizeof(sub)); 91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sub.type = event_type[i]; 91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::~omx_vdec 92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Destructor 93011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 93111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None 93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::~omx_vdec() 93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info = NULL; 94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("In OMX vdec Destructor"); 94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (msg_thread_created) { 94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Signalling close to OMX Msg Thread"); 94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel message_thread_stop = true; 94411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_message(this, OMX_COMPONENT_CLOSE_MSG); 94511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit"); 94611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_join(msg_thread_id,NULL); 94711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_pipe_in); 94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_pipe_out); 95011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_in = -1; 95111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_out = -1; 95211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit"); 95311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eventfd_write(m_poll_efd, 1)) { 95411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("eventfd_write failed for fd: %d, errno = %d, force stop async_thread", m_poll_efd, errno); 95511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_force_stop = true; 95611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 95711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 95811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (async_thread_created) 95911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_join(async_thread_id,NULL); 96011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsubscribe_to_events(drv_ctx.video_driver_fd); 96111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_poll_efd); 96211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.video_driver_fd); 96311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_destroy(&m_lock); 96411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_destroy(&c_lock); 96511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_destroy(&buf_lock); 96611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_destroy(&m_cmd_lock); 967fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel pthread_mutex_destroy(&m_hdr_info_client_lock); 96811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (perf_flag) { 96911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME"); 97011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec_time.end(); 97111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 97211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("Exit OMX vdec Destructor: fd=%d",drv_ctx.video_driver_fd); 97311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_control.send_hint_to_mpctl(false); 97411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 97511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 97611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type) 97711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 97811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 97911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 98011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 98111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 98211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 0; 98311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 98411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 98511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(buffer_type == VDEC_BUFFER_TYPE_INPUT) { 98611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 98711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 0; 98811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 98911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 99011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 99111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 99211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 99311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 99411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_dpb(bool is_split_mode, int dpb_color_format) 99511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 99611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 99711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_control ctrl[2]; 99811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_controls controls; 99911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("DPB mode: %s DPB color format: %s OPB color format: %s", 100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_split_mode ? "split" : "combined", 100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC ? "nv12_ubwc": 100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC ? "nv12_10bit_ubwc": 100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE ? "same as opb": 100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "unknown", 100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capture_capability == V4L2_PIX_FMT_NV12 ? "nv12": 100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capture_capability == V4L2_PIX_FMT_NV12_UBWC ? "nv12_ubwc": 1008b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel capture_capability == V4L2_PIX_FMT_NV12_TP10_UBWC ? "nv12_10bit_ubwc": 100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "unknown"); 101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_MODE; 101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_split_mode) { 101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_SECONDARY; 101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_PRIMARY; 101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_DPB_COLOR_FORMAT; 101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].value = dpb_color_format; 102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.count = 2; 102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.ctrl_class = V4L2_CTRL_CLASS_MPEG; 102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls = ctrl; 102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_EXT_CTRLS, &controls); 102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set ext ctrls for opb_dpb: %d\n", rc); 102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 102911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1034b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry StrudelOMX_ERRORTYPE omx_vdec::decide_dpb_buffer_mode(bool split_opb_dpb_with_same_color_fmt) 103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 103711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 1039b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool cpu_access = (capture_capability != V4L2_PIX_FMT_NV12_UBWC) && 1040b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel capture_capability != V4L2_PIX_FMT_NV12_TP10_UBWC; 1041b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool tp10_enable = !cpu_access && 1042b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10; 1043b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool dither_enable = true; 1044b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 1045b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel switch (m_dither_config) { 1046b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel case DITHER_DISABLE: 1047b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel dither_enable = false; 1048b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel break; 1049b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel case DITHER_COLORSPACE_EXCEPTBT2020: 1050b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel dither_enable = (m_color_space == EXCEPT_BT2020); 1051b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel break; 1052b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel case DITHER_ALL_COLORSPACE: 1053b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel dither_enable = true; 1054b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel break; 1055b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel default: 1056b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_ERROR("Unsupported dither configuration:%d", m_dither_config); 1057b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1058b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 1059b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (tp10_enable && !dither_enable) { 1060b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_TP10_UBWC; 1061b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel capture_capability = V4L2_PIX_FMT_NV12_TP10_UBWC; 1062b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 1063b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 1064b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1065b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 1066b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (rc) { 1067b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_ERROR("%s: Failed get format on capture mplane", __func__); 1068b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return OMX_ErrorUnsupportedSetting; 1069b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1070b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 1071b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 1072b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (rc) { 1073b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_ERROR("%s: Failed set format on capture mplane", __func__); 1074b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return OMX_ErrorUnsupportedSetting; 1075b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1076b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 1077b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1078b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 108011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_IDLE_PENDING) && 108111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 108211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Invalid state to decide on dpb-opb split"); 108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cpu_access) { 108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) { 108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Disabled split mode for VP9. In split mode the DPB buffers are part of the internal 109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * scratch buffers and the driver does not does the reference buffer management for 109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * scratch buffers. In case of VP9 with spatial scalability, when a sequence changed 109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * event is received with the new resolution, and when a flush is sent by the driver, it 109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * releases all the references of internal scratch buffers. However as per the VP9 109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * spatial scalability, even after the flush, the buffers which have not yet received 109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * release reference event should not be unmapped and freed. Currently in driver, 109611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * reference buffer management of the internal scratch buffer is not implemented 109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * and hence the DPB buffers get unmapped. For other codecs it does not matter 109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * as with the new SPS/PPS, the DPB is flushed. 109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 1100b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool is_not_vp9 = eCompressionFormat != OMX_VIDEO_CodingVP9; 1101b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool eligible_for_split_dpb_ubwc = 1102b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel m_progressive == MSM_VIDC_PIC_STRUCT_PROGRESSIVE && //@ Due to Venus limitation for Interlaced, Split mode enabled only for Progressive. 1103b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel is_not_vp9 && //@ Split mode disabled for VP9. 1104b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel !drv_ctx.idr_only_decoding && //@ Split mode disabled for Thumbnail usecase. 1105b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel !m_disable_split_mode; //@ Set prop to disable split mode 1106b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 1107b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel //Since opb is linear, dpb should also be linear. 1108b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (split_opb_dpb_with_same_color_fmt) { 1109b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel eligible_for_split_dpb_ubwc = false; 1110b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1111b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 1112b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (eligible_for_split_dpb_ubwc) { 111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //split DPB-OPB 111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DPB -> UBWC , OPB -> Linear 111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC); 1116b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (split_opb_dpb_with_same_color_fmt) { 111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DPB -> Linear, OPB -> Linear 111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE); 111911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 112011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DPB-OPB combined linear 112111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE); 112211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 112311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) { 112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //split DPB-OPB 112511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DPB -> UBWC, OPB -> Linear 112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC); 112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { //no cpu access 112911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) { 1130b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (split_opb_dpb_with_same_color_fmt) { 113111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //split DPB-OPB 113211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DPB -> UBWC, OPB -> UBWC 113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC); 113411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DPB-OPB combined UBWC 113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE); 113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) { 1139b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (dither_enable) { 1140b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel //split DPB-OPB 1141b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel //DPB -> TP10UBWC, OPB -> UBWC 1142b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC); 1143b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else { 1144b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel //combined DPB-OPB 1145b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel //DPB -> TP10UBWC, OPB -> TP10UBWC 1146b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC); 1147b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet) { 115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set DPB buffer mode: %d", eRet); 115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1154b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::enable_downscalar() 116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_down_scalar_enabled) { 116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s: already enabled", __func__); 116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 116811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 116911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 117011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdec::enable_downscalar"); 117111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = decide_dpb_buffer_mode(true); 117211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 117311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: decide_dpb_buffer_mode Failed ", __func__); 117411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 117511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_down_scalar_enabled = true; 117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&control, 0x0, sizeof(struct v4l2_control)); 117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_KEEP_ASPECT_RATIO; 118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: Failed to set VIDEO_KEEP_ASPECT_RATIO", __func__); 118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 118511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::disable_downscalar() 119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 119311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 119411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 119511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!is_down_scalar_enabled) { 119611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdec::disable_downscalar: already disabled"); 119711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 119811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = decide_dpb_buffer_mode(false); 120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s:decide_dpb_buffer_mode failed\n", __func__); 120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 120411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_down_scalar_enabled = false; 120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::decide_downscalar() 121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum color_fmts color_format; 12152601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_U32 width, height; 121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1217b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (capture_capability == V4L2_PIX_FMT_NV12_TP10_UBWC) { 1218b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel rc = disable_downscalar(); 1219b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (rc) { 1220b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_ERROR("Disable downscalar failed!"); 1221b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return rc; 1222b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1223b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return 0; 1224b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1225b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_downscalar_width || !m_downscalar_height) { 122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s: downscalar not supported", __func__); 122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_force_down_scalar) { 123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s: m_force_down_scalar %d ", __func__, m_force_down_scalar); 123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 123811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 123911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__); 124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel height = fmt.fmt.pix_mp.height; 12462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel width = fmt.fmt.pix_mp.width; 12472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("%s: driver wxh = %dx%d, downscalar wxh = %dx%d m_is_display_session = %d", __func__, 124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, m_downscalar_width, m_downscalar_height, m_is_display_session); 125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12512601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if ((fmt.fmt.pix_mp.width * fmt.fmt.pix_mp.height >= m_downscalar_width * m_downscalar_height) && 125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_is_display_session) { 125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = enable_downscalar(); 125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__); 125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel width = m_downscalar_width > fmt.fmt.pix_mp.width ? 126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width : m_downscalar_width; 12612601808ee2992a94c325d05e4065aba60b01840bThierry Strudel height = m_downscalar_height > fmt.fmt.pix_mp.height ? 126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height : m_downscalar_height; 126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (capture_capability) { 126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_NV12: 126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = COLOR_FMT_NV12; 126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_NV12_UBWC: 126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = COLOR_FMT_NV12_UBWC; 126911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 127011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_NV12_TP10_UBWC: 127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = COLOR_FMT_NV12_BPP10_UBWC; 127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Color format not recognized\n"); 127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = OMX_ErrorUndefined; 127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = disable_downscalar(); 128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__); 128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 12892601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.height = height; 12902601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.width = width; 129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: Failed set format on capture mplane", __func__); 129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = get_buffer_req(&drv_ctx.op_buf); 129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: Failed to get output buffer requirements", __func__); 130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::OMXCntrlProcessMsgCb 131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel IL Client callbacks are generated through this routine. The decoder 131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel provides the thread context for this routine. 131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctxt -- Context information related to the self. 131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id -- Event identifier. This could be any of the following: 131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1. Command completion event 131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2. Buffer done callback event 132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3. Frame done callback event 132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id) 132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1; // Parameter - 1 132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2; // Parameter - 2 133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident; 133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned qsize=0; // qsize 133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec *pThis = (omx_vdec *) ctxt; 133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis) { 133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out", 133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel __func__); 133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Protect the shared queue data structure 134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel do { 134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Read the message id's from the queue*/ 134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&pThis->m_lock); 134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_cmd_q.m_size; 134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize) { 134611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cmd_q.pop_entry(&p1, &p2, &ident); 134711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 134811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 134911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize == 0 && pThis->m_state != OMX_StatePause) { 135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_ftb_q.m_size; 135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize) { 135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_ftb_q.pop_entry(&p1, &p2, &ident); 135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize == 0 && pThis->m_state != OMX_StatePause) { 135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_etb_q.m_size; 135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize) { 135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_etb_q.pop_entry(&p1, &p2, &ident); 136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&pThis->m_lock); 136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*process message if we have one*/ 136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize > 0) { 136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id = ident; 136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (id) { 136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EVENT: 136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (p1) { 137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandStateSet: 137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = (OMX_STATETYPE) p2; 137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d", 137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state); 137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL); 137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_EventError: 138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == OMX_StateInvalid) { 138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid"); 138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = (OMX_STATETYPE) p2; 138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventError, OMX_ErrorInvalidState, p2, NULL); 138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (p2 == (unsigned long)OMX_ErrorHardware) { 138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error(); 138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventError, p2, (OMX_U32)NULL, NULL ); 139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortDisable: 139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%lu]", p2); 139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == OMX_CORE_OUTPUT_PORT_INDEX) { 140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT)) 140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to release output buffers"); 140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf); 140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->in_reconfig = false; 140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error(); 141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL ); 141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortEnable: 141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%lu]", p2); 141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ 141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL ); 142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL ); 142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_ETB_ARBITRARY: 143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\ 143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) { 143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure"); 143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_ETB: { 144011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE iret; 144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel iret = pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1, (OMX_BUFFERHEADERTYPE *)p2); 144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (iret == OMX_ErrorInsufficientResources) { 144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure due to HW overload"); 144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_hw_overload (); 144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (iret != OMX_ErrorNone) { 144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure"); 144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_FTB: 145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)(intptr_t)p1,\ 145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) { 145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure"); 145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_COMMAND: 146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\ 146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_U32)p2,(OMX_PTR)NULL); 146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EBD: 146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) { 146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure"); 146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) { 147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->time_stamp_dts.remove_time_stamp( 147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((OMX_BUFFERHEADERTYPE *)(intptr_t)p1)->nTimeStamp, 147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ?true:false); 147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( pThis->empty_buffer_done(&pThis->m_cmp, 147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone) { 148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_buffer_done failure"); 148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: { 148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int64_t *timestamp = (int64_t *)(intptr_t)p1; 148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p1) { 148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->time_stamp_dts.remove_time_stamp(*timestamp, 148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ?true:false); 149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(timestamp); 149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_FBD: 149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure"); 149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ( pThis->fill_buffer_done(&pThis->m_cmp, 150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone ) { 150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("fill_buffer_done failure"); 150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH: 150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Driver flush i/p Port complete"); 150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->input_flush_progress) { 150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver"); 151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->execute_input_flush(); 151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure"); 151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if we need generate event for Flush done*/ 151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_INPUT_FLUSH_PENDING)) { 152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING); 152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Input Flush completed - Notify Client"); 152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandFlush, 152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX,NULL ); 152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_IDLE_PENDING)) { 152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) { 152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port"); 153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->streaming[OUTPUT_PORT] = false; 153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->output_flush_progress) { 153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Input flush done hence issue stop"); 153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_STOP_DONE); 153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH: 154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Driver flush o/p Port complete"); 154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->output_flush_progress) { 155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver"); 155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->execute_output_flush(); 155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed"); 155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if we need generate event for Flush done*/ 155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) { 156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Notify Output Flush done"); 156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandFlush, 156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX,NULL ); 156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Internal flush complete"); 157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags, 157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) { 157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->post_event(OMX_CommandPortDisable, 157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, 157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags, 157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags, 158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) { 158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) { 158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port"); 158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->streaming[CAPTURE_PORT] = false; 159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->input_flush_progress) { 159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Output flush done hence issue stop"); 159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_STOP_DONE); 159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_START_DONE: 160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE"); 160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure"); 161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success"); 161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Move to executing"); 161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StateExecuting; 161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateExecuting, NULL); 162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (BITMASK_PRESENT(&pThis->m_flags, 162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_PAUSE_PENDING)) { 162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (/*ioctl (pThis->drv_ctx.video_driver_fd, 162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) { 162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed"); 162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Event Handler callback is NULL"); 163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_PAUSE_DONE: 163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE"); 163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed"); 164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->complete_pending_buffer_done_cbs(); 164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) { 164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity"); 164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Send the callback now 164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING); 164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StatePause; 164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StatePause, NULL); 165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_RESUME_DONE: 166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE"); 166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed"); 166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Moving the decoder to execute state"); 166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StateExecuting; 167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateExecuting,NULL); 167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_STOP_DONE: 168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE"); 168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed"); 168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->complete_pending_buffer_done_cbs(); 169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) { 169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success"); 169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING); 169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StateIdle; 169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Move to Idle State"); 169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data, 169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateIdle,NULL); 170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == OMX_IndexParamPortDefinition) { 171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexParamPortDefinition"); 171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->in_reconfig = true; 171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (p2 == OMX_IndexConfigCommonOutputCrop) { 171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexConfigCommonOutputCrop"); 171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Check if resolution is changed in smooth streaming mode */ 171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_smoothstreaming_mode && 171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (pThis->framesize.nWidth != 171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width) || 171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (pThis->framesize.nHeight != 172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height)) { 172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Resolution changed from: wxh = %dx%d to: wxh = %dx%d", 172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->framesize.nWidth, 172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->framesize.nHeight, 172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width, 172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height); 172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Update new resolution */ 172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->framesize.nWidth = 173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width; 173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->framesize.nHeight = 173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height; 173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Update C2D with new resolution */ 173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->client_buffers.update_buffer_req()) { 173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting C2D buffer requirements failed"); 173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Update new crop information */ 174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nLeft = pThis->drv_ctx.frame_size.left; 174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nTop = pThis->drv_ctx.frame_size.top; 174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nWidth = pThis->drv_ctx.frame_size.right; 174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nHeight = pThis->drv_ctx.frame_size.bottom; 174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Validate the new crop information */ 174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->rectangle.nLeft + pThis->rectangle.nWidth > 174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width) { 174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Crop L[%u] + R[%u] > W[%u]", 175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nLeft, pThis->rectangle.nWidth, 175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width); 175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nLeft = 0; 175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->rectangle.nWidth > 175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width) { 175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Crop R[%u] > W[%u]", 175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nWidth, 176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width); 176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nWidth = 176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width; 176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->rectangle.nTop + pThis->rectangle.nHeight > 176611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height) { 176711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 176811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Crop T[%u] + B[%u] > H[%u]", 176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nTop, pThis->rectangle.nHeight, 177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height); 177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nTop = 0; 177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->rectangle.nHeight > 177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height) { 177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Crop B[%u] > H[%u]", 177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nHeight, 177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height); 177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nHeight = 178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height; 178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Updated Crop Info: L: %u, T: %u, R: %u, B: %u", 178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nLeft, pThis->rectangle.nTop, 178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nWidth, pThis->rectangle.nHeight); 1786fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (p2 == OMX_QTIIndexConfigDescribeColorAspects) { 1787fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeColorAspects"); 1788fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } else if (p2 == OMX_QTIIndexConfigDescribeHDRColorInfo) { 1789fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeHDRcolorinfo"); 179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Rxd Invalid PORT_RECONFIG event (%lu)", p2); 179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_debug.outfile) { 179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(pThis->m_debug.outfile); 179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_debug.outfile = NULL; 179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_debug.out_ymeta_file) { 179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(pThis->m_debug.out_ymeta_file); 180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_debug.out_ymeta_file = NULL; 180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_debug.out_uvmeta_file) { 180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(pThis->m_debug.out_uvmeta_file); 180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_debug.out_uvmeta_file = NULL; 180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->secure_mode && pThis->m_cb.EventHandler && pThis->in_reconfig) { 180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->prefetchNewBuffers(); 180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t frame_data[4]; 181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_data[0] = (p2 == OMX_IndexParamPortDefinition) ? 181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_reconfig_height : pThis->rectangle.nHeight; 181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_data[1] = (p2 == OMX_IndexParamPortDefinition) ? 181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_reconfig_width : pThis->rectangle.nWidth; 181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_data[2] = (p2 == OMX_IndexParamPortDefinition) ? 181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_data[0] : pThis->drv_ctx.video_resolution.frame_height; 182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_data[3] = (p2 == OMX_IndexParamPortDefinition) ? 182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_data[1] : pThis->drv_ctx.video_resolution.frame_width; 182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventPortSettingsChanged, p1, p2, (void*) frame_data ); 182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EOS_DONE: 183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE"); 183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag, 183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL ); 183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->prev_ts = LLONG_MAX; 184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rst_prev_ts = true; 184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR"); 184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error(); 184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING: 184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING"); 185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_unsupported_setting(); 185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD: 185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD"); 185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_hw_overload(); 185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&pThis->m_lock); 186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_cmd_q.m_size; 186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_state != OMX_StatePause) 186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size); 186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&pThis->m_lock); 186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } while (qsize>0); 186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::update_resolution(int width, int height, int stride, int scan_lines) 187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int format_changed = 0; 187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((height != (int)drv_ctx.video_resolution.frame_height) || 187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (width != (int)drv_ctx.video_resolution.frame_width)) { 187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)", 187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel width, drv_ctx.video_resolution.frame_width, 187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel height,drv_ctx.video_resolution.frame_height); 187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel format_changed = 1; 188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height = height; 188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width = width; 188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.scan_lines = scan_lines; 188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.stride = stride; 1885fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 1886fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (!is_down_scalar_enabled) { 1887fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel rectangle.nLeft = m_extradata_info.output_crop_rect.nLeft; 1888fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel rectangle.nTop = m_extradata_info.output_crop_rect.nTop; 1889fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel rectangle.nWidth = m_extradata_info.output_crop_rect.nWidth; 1890fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel rectangle.nHeight = m_extradata_info.output_crop_rect.nHeight; 189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return format_changed; 189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::is_video_session_supported() 189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", 189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE) && 189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_profile == HIGH_PROFILE || m_profile == MAIN_PROFILE)) { 190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_width = 1280; 190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_height = 720; 190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set max_width=1280 & max_height=720 for H264 HP/MP"); 190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((drv_ctx.video_resolution.frame_width * 190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height > 190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_width * 190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_height) || 190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.video_resolution.frame_width* 191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height < 191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_width * 191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_height)) { 191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR( 191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)", 191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width, 191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height, 191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_width, 191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_height, 191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_width, 192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_height); 192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("video session supported"); 192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::log_input_buffers(const char *buffer_addr, int buffer_len) 192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.in_buffer_log && !m_debug.infile) { 193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) { 193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.m4v", 193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) { 193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.mpg", m_debug.log_loc, 193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) { 193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.263", 193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE) || 194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.264", 194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.265", 194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) { 194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1", 194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE)) { 195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1", 195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) { 195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf", 195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { 195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf", 195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.divx", 196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.infile = fopen (m_debug.infile_name, "ab"); 196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug.infile) { 196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile_name); 196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.infile_name[0] = '\0'; 196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) || 196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { 197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ivf_file_header { 197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 signature[4]; //='DKIF'; 197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 version ; //= 0; 197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 headersize ; //= 32; 197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 FourCC; 197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 width; 197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 height; 197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 rate; 197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 scale; 197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 length; 198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 unused[4]; 198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } file_header; 198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&file_header,0,sizeof(file_header)); 198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.signature[0] = 'D'; 198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.signature[1] = 'K'; 198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.signature[2] = 'I'; 198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.signature[3] = 'F'; 198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.version = 0; 198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.headersize = 32; 199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (drv_ctx.decoder_format) { 199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_CODECTYPE_VP8: 199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.FourCC = 0x30385056; 199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_CODECTYPE_VP9: 199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.FourCC = 0x30395056; 199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("unsupported format for VP8/VP9"); 199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite((const char *)&file_header, 200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(file_header),1,m_debug.infile); 200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.infile && buffer_addr && buffer_len) { 200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) || 200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { 200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vpx_ivf_frame_header { 200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 framesize; 201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 timestamp_lo; 201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 timestamp_hi; 201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } vpx_frame_header; 201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vpx_frame_header.framesize = buffer_len; 201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Currently FW doesn't use timestamp values */ 201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vpx_frame_header.timestamp_lo = 0; 201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vpx_frame_header.timestamp_hi = 0; 201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite((const char *)&vpx_frame_header, 201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(vpx_frame_header),1,m_debug.infile); 201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite(buffer_addr, buffer_len, 1, m_debug.infile); 202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::log_output_buffers(OMX_BUFFERHEADERTYPE *buffer) { 202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int buf_index = 0; 202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char *temp = NULL; 202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.out_buffer_log && !m_debug.outfile && buffer->nFilledLen) { 203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.outfile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.yuv", 203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.outfile = fopen (m_debug.outfile_name, "ab"); 203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug.outfile) { 203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to open output file: %s for logging", m_debug.log_loc); 203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.outfile_name[0] = '\0'; 203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.out_meta_buffer_log && !m_debug.out_ymeta_file && !m_debug.out_uvmeta_file 204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && buffer->nFilledLen) { 204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.out_ymetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.ymeta", 204311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.out_uvmetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.uvmeta", 204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_ymeta_file = fopen (m_debug.out_ymetafile_name, "ab"); 204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_uvmeta_file = fopen (m_debug.out_uvmetafile_name, "ab"); 204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug.out_ymeta_file || !m_debug.out_uvmeta_file) { 204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to open output y/uv meta file: %s for logging", m_debug.log_loc); 205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_ymetafile_name[0] = '\0'; 205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_uvmetafile_name[0] = '\0'; 205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((!m_debug.outfile && !m_debug.out_ymeta_file) || !buffer || !buffer->nFilledLen) 205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_index = buffer - m_out_mem_ptr; 206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr; 206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2062b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC || 2063b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) { 206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Logging UBWC yuv width/height(%u/%u)", 206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width, 206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height); 206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.outfile) 206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite(temp, buffer->nFilledLen, 1, m_debug.outfile); 207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.out_ymeta_file && m_debug.out_uvmeta_file) { 207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int width = 0, height = 0; 207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int y_plane, y_meta_plane; 207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int y_stride = 0, y_sclines = 0; 207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int y_meta_stride = 0, y_meta_scanlines = 0, uv_meta_stride = 0, uv_meta_scanlines = 0; 2076b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel int color_fmt = (drv_ctx.output_format== VDEC_YUV_FORMAT_NV12_UBWC)? COLOR_FMT_NV12_UBWC: COLOR_FMT_NV12_BPP10_UBWC; 207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int i; 207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int bytes_written = 0; 207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel width = drv_ctx.video_resolution.frame_width; 208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel height = drv_ctx.video_resolution.frame_height; 208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width); 208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height); 208411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_stride = VENUS_Y_STRIDE(color_fmt, width); 208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_sclines = VENUS_Y_SCANLINES(color_fmt, height); 208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width); 208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height); 208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_meta_plane = MSM_MEDIA_ALIGN(y_meta_stride * y_meta_scanlines, 4096); 209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096); 209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr; 209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < y_meta_scanlines; i++) { 209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes_written = fwrite(temp, y_meta_stride, 1, m_debug.out_ymeta_file); 209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp += y_meta_stride; 209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + y_meta_plane + y_plane; 209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i = 0; i < uv_meta_scanlines; i++) { 210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes_written += fwrite(temp, uv_meta_stride, 1, m_debug.out_uvmeta_file); 210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp += uv_meta_stride; 210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 2104b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) { 210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int stride = drv_ctx.video_resolution.stride; 210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int scanlines = drv_ctx.video_resolution.scan_lines; 210711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_smoothstreaming_mode) { 210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = drv_ctx.video_resolution.frame_width; 210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel scanlines = drv_ctx.video_resolution.frame_height; 211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = (stride + DEFAULT_WIDTH_ALIGNMENT - 1) & (~(DEFAULT_WIDTH_ALIGNMENT - 1)); 211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel scanlines = (scanlines + DEFAULT_HEIGHT_ALIGNMENT - 1) & (~(DEFAULT_HEIGHT_ALIGNMENT - 1)); 211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i; 211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Logging width/height(%u/%u) stride/scanlines(%u/%u)", 211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width, 211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height, stride, scanlines); 211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int bytes_written = 0; 211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) { 211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile); 212011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp += stride; 212111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 212211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines; 212311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int stride_c = stride; 212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) { 212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile); 212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp += stride_c; 212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ComponentInit 213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Initialize the component. 213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctxt -- Context information related to the self. 214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id -- Event identifier. This could be any of the following: 214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1. Command completion event 214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2. Buffer done callback event 214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3. Frame done callback event 214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 214811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 214911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role) 215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 215211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 215311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 215411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_fmtdesc fdesc; 215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_frmsizeenum frmsize; 215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int alignment = 0,buffer_size = 0; 216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fds[2]; 216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int r,ret=0; 216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool codec_ambiguous = false; 216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STRING device_name = (OMX_STRING)"/dev/video32"; 216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char property_value[PROPERTY_VALUE_MAX] = {0}; 216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FILE *soc_file = NULL; 216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char buffer[10]; 216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char platform_name[PROPERTY_VALUE_MAX]; 217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("ro.board.platform", platform_name, "0"); 217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(platform_name, "msm8610", 7)) { 217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel device_name = (OMX_STRING)"/dev/video/q6_dec"; 217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_q6_platform = true; 217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel maxSmoothStreamingWidth = 1280; 217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel maxSmoothStreamingHeight = 720; 217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_thulium_v1 = false; 218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel soc_file = fopen("/sys/devices/soc0/soc_id", "r"); 218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (soc_file) { 218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fread(buffer, 1, 4, soc_file); 218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(soc_file); 218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(buffer) == 246) { 218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel soc_file = fopen("/sys/devices/soc0/revision", "r"); 218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (soc_file) { 218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fread(buffer, 1, 4, soc_file); 218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(soc_file); 218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(buffer) == 1) { 219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_thulium_v1 = true; 219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("is_thulium_v1 = TRUE"); 219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * turn off frame parsing for Android by default. 220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Clients may configure OMX_QCOM_FramePacking_Arbitrary to enable this mode 220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0"); 220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(property_value)) { 220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("arbitrary_bytes mode enabled via property command"); 220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = true; 220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(role, "OMX.qcom.video.decoder.avc.secure", 221111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 221211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 221311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 221411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.avc"; 221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg2.secure", 221611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 221711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 221811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 221911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg2"; 222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(role, "OMX.qcom.video.decoder.hevc.secure", 222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.hevc"; 222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(role, "OMX.qcom.video.decoder.vc1.secure", 222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.vc1"; 223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(role, "OMX.qcom.video.decoder.wmv.secure", 223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.wmv"; 223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg4.secure", 223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg4"; 224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(role, "OMX.qcom.video.decoder.vp9.secure", 224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.vp9"; 224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp(role, "OMX.qcom.video.decoder.vp8.secure", 224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.vp8"; 225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_driver_fd = open(device_name, O_RDWR); 225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("component_init: %s : fd=%d", role, drv_ctx.video_driver_fd); 225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.video_driver_fd < 0) { 225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno); 225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS; 226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator = 1; 226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel operating_frame_rate = DEFAULT_FPS; 226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel high_fps = false; 226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_poll_efd = eventfd(0, 0); 226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_poll_efd < 0) { 226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to create event fd(%s)", strerror(errno)); 226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = subscribe_to_events(drv_ctx.video_driver_fd); 227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ret) { 227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_created = true; 227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = pthread_create(&async_thread_id,0,async_message_thread,this); 227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to create async_message_thread"); 227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_created = false; 227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG 228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel outputExtradataFile = fopen (output_extradata_filename, "ab"); 228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Copy the role information which provides the decoder kind 228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(drv_ctx.kind,role,128); 228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\ 228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.mpeg4",\ 229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE); 229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.timestamp_adjust = true; 229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4; 229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingMPEG4; 229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability=V4L2_PIX_FMT_MPEG4; 229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Initialize Start Code for MPEG4*/ 229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_MPEG4; 229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\ 230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.mpeg2",\ 230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE); 230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2; 230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_MPEG2; 230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingMPEG2; 230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Initialize Start Code for MPEG2*/ 230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_MPEG2; 230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\ 231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("H263 Decoder selected"); 231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_H263; 231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingH263; 231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_H263; 231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_H263; 231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\ 231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW ("DIVX 311 Decoder selected"); 232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3; 232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_DIVX_311; 232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_DIVX; 232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\ 232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected"); 233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4; 233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_DIVX; 233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_DIVX; 233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_ambiguous = true; 233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\ 234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected"); 234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6; 234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_DIVX; 234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_DIVX; 234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_ambiguous = true; 234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\ 235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_H264; 235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability=V4L2_PIX_FMT_H264; 235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingAVC; 235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_H264; 235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_nal_length(nal_length); 235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_thulium_v1) { 236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = true; 236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enable arbitrary_bytes for h264"); 236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc",\ 236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE); 236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_MVC; 236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_H264_MVC; 236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC; 236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_H264; 237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_nal_length(nal_length); 237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\ 237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC; 237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_HEVC; 237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc; 237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_HEVC; 237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_nal_length(nal_length); 238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\ 238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_VC1; 238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingWMV; 238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_VC1; 238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_VC1_ANNEX_G; 238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\ 239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV; 239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingWMV; 239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_VC1; 239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_VC1_ANNEX_L; 239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", \ 239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_VP8; 240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_VP8; 240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingVP8; 240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_VP8; 240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", \ 240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE); 240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_VP9; 240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_VP9; 241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingVP9; 241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_VP9; 241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Unknown Component"); 241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidComponentName; 241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COLOR_FORMATTYPE dest_color_format; 242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_disable_ubwc_mode) { 242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_format = VDEC_YUV_FORMAT_NV12; 242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_UBWC; 242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eCompressionFormat == (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC) 242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_color_format = (OMX_COLOR_FORMATTYPE) 242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView; 242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_color_format = (OMX_COLOR_FORMATTYPE) 243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_buffers.set_color_format(dest_color_format)) { 243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting color format failed"); 243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dpb_bit_depth = MSM_VIDC_BIT_DEPTH_8; 243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_progressive = MSM_VIDC_PIC_STRUCT_PROGRESSIVE; 243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_disable_ubwc_mode) { 244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capture_capability = V4L2_PIX_FMT_NV12; 244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capture_capability = V4L2_PIX_FMT_NV12_UBWC; 244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_capability cap; 244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap); 244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to query capabilities"); 244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Capabilities: driver_name = %s, card = %s, bus_info = %s," 245211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " version = %d, capabilities = %x", cap.driver, cap.card, 245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cap.bus_info, cap.version, cap.capabilities); 245411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret=0; 245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.index=0; 245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.pixelformat, fdesc.flags); 246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.index++; 246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.index=0; 246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.pixelformat, fdesc.flags); 246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.index++; 247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 2471fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nLeft = 0; 2472fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nTop = 0; 2473fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nWidth = 320; 2474fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nHeight = 240; 247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel update_resolution(320, 240, 320, 240); 2476fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set format on output port"); 248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set Format was successful"); 248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_ambiguous) { 248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_capability == V4L2_PIX_FMT_DIVX) { 249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control divx_ctrl; 249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) { 249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4; 249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) { 249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5; 249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6; 249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT; 250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl); 250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set divx version"); 250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Codec should not be ambiguous"); 250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("persist.vidc.dec.conceal_color", property_value, DEFAULT_CONCEAL_COLOR); 251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_conceal_color= atoi(property_value); 251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("trying to set 0x%u as conceal color\n", (unsigned int)m_conceal_color); 251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONCEAL_COLOR; 251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = m_conceal_color; 251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set conceal color %d\n", ret); 251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Get the hardware capabilities 252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&frmsize,0,sizeof(frmsize)); 252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frmsize.index = 0; 252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frmsize.pixel_format = output_capability; 252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, 252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VIDIOC_ENUM_FRAMESIZES, &frmsize); 252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) { 252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to get framesizes"); 252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) { 253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_width = frmsize.stepwise.min_width; 253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_width = frmsize.stepwise.max_width; 253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_height = frmsize.stepwise.min_height; 253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_height = frmsize.stepwise.max_height; 253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set format on capture port"); 254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&framesize, 0, sizeof(OMX_FRAMESIZETYPE)); 254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framesize.nWidth = drv_ctx.video_resolution.frame_width; 255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framesize.nHeight = drv_ctx.video_resolution.frame_height; 255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&rectangle, 0, sizeof(OMX_CONFIG_RECTTYPE)); 255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nWidth = drv_ctx.video_resolution.frame_width; 255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nHeight = drv_ctx.video_resolution.frame_height; 255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set Format was successful"); 255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode) { 255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE; 255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret); 256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret); 256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_capability == V4L2_PIX_FMT_H264_MVC) { 256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_MVC_BUFFER_LAYOUT; 256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_MVC_TOP_BOTTOM; 257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set MVC buffer layout"); 257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_thulium_v1) { 257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_smoothstreaming(); 257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to enable smooth streaming on driver"); 258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Get the Buffer requirements for input and output ports*/ 258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT; 258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode) { 259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.alignment = SECURE_ALIGN; 259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.alignment = SECURE_ALIGN; 259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.alignment = SZ_4K; 259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.alignment = SZ_4K; 259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata = 0; 259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.picture_order = VDEC_ORDER_DISPLAY; 260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.idr_only_decoding = 0; 260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.downscalar_width",property_value,"0"); 260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(property_value)) { 260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_width = atoi(property_value); 260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.downscalar_height",property_value,"0"); 261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(property_value)) { 261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_height = atoi(property_value); 261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_downscalar_width < m_decoder_capability.min_width || 261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_height < m_decoder_capability.min_height) { 261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_width = 0; 261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_height = 0; 261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Downscaler configured WxH %dx%d\n", 262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_width, m_downscalar_height); 262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.disable.split.mode",property_value,"0"); 262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disable_split_mode = atoi(property_value); 262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("split mode is %s", m_disable_split_mode ? "disabled" : "enabled"); 262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StateLoaded; 262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef DEFAULT_EXTRADATA 263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enable_extradata(DEFAULT_EXTRADATA, true, true); 263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 263211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.ip_buf); 263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Input Buffer Size =%u",(unsigned int)drv_ctx.ip_buf.buffer_size); 263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel get_buffer_req(&drv_ctx.op_buf); 263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 || 263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC || 263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) { 263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size; 263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size); 264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nOffset = 0; 264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.pBuffer == NULL) { 264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed "); 264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 || 264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) { 265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils == NULL) { 265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils = new H264_Utils(); 265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils == NULL) { 265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("parser utils Allocation failed "); 265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->initialize_frame_checking_environment(); 265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size); 265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser = new h264_stream_parser(); 266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!h264_parser) { 266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!"); 266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pipe(fds)) { 266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("pipe creation failed"); 267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_in = fds[0]; 267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_out = fds[1]; 267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_created = true; 267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel r = pthread_create(&msg_thread_id,0,message_thread_dec,this); 267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (r < 0) { 267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("component_init(): message_thread_dec creation failed"); 267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_created = false; 268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Component Init Failed"); 268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("omx_vdec::component_init() success : fd=%d", 268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_driver_fd); 269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer)); 269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::GetComponentVersion 269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns the component version. 270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel TBD. 270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone. 270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_component_version 271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel( 271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_STRING componentName, 271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* componentVersion, 271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* specVersion, 271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_UUIDTYPE* componentUUID 271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) componentName; 272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) componentVersion; 272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) componentUUID; 272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Comp Version in Invalid State"); 272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* TBD -- Return the proper version */ 272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (specVersion) { 272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel specVersion->nVersion = OMX_SPEC_VERSION; 272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::SendCommand 273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns zero if all the buffers released.. 273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp, 274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_COMMANDTYPE cmd, 274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 param1, 274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR cmdData 275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) cmdData; 275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command: Recieved a Command from Client"); 275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State"); 275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX 276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) { 276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush " 276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "to invalid port: %u", (unsigned int)param1); 276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND); 276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_wait(&m_cmd_lock); 276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command: Command Processed"); 276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::SendCommand 277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns zero if all the buffers released.. 277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, 278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_COMMANDTYPE cmd, 278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 param1, 278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR cmdData 279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) cmdData; 279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE eState = (OMX_STATETYPE) param1; 279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int bFlag = 1,sem_posted = 0,ret=0; 279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd); 279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d", 280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state, eState); 280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmd == OMX_CommandStateSet) { 280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued"); 280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState); 280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Loaded */ 280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateLoaded) { 280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateIdle) { 281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //if all buffers are allocated or all ports disabled 281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocate_done() || 281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) { 281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle"); 281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending"); 281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING); 281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Loaded */ 282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateLoaded) { 282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded"); 282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to WaitForResources */ 282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition */ 283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources"); 283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Executing */ 283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateExecuting) { 283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing"); 283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Pause */ 284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause"); 284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Invalid */ 284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid"); 285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\ 285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eState); 285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is IDLE */ 286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateIdle) { 286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateLoaded) { 286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_done()) { 286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Since error is None , we will post an event at the end 286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel of this function definition 286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded"); 287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending"); 287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING); 287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Executing */ 287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateExecuting) { 288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING); 288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 1; 288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state=OMX_StateExecuting; 288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful"); 288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Idle */ 288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateIdle) { 288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle"); 289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to WaitForResources */ 289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources"); 289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Pause */ 290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*To pause the Video core we need to start the driver*/ 290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START, 290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NULL) < */0) { 290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED"); 290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause"); 291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Invalid */ 291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid"); 291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState); 292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /******************************/ 292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Executing */ 292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /******************************/ 292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateExecuting) { 293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting"); 293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Idle */ 293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateIdle) { 293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition 293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle"); 293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) { 293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_ALL); 294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Paused */ 294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("PAUSE Command Issued"); 294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StatePause; 294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 1; 295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Loaded */ 295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateLoaded) { 295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded"); 295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to WaitForResources */ 295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources"); 296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Executing */ 296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateExecuting) { 296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing"); 296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Invalid */ 297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid"); 297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 297711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState); 297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Pause */ 298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StatePause) { 298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Executing */ 298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateExecuting) { 298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pause --> Executing"); 298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StateExecuting; 299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 1; 299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Idle */ 299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateIdle) { 299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition */ 299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pause --> Idle"); 299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) { 299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_ALL); 300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to loaded */ 300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateLoaded) { 300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Pause --> loaded"); 300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to WaitForResources */ 301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Pause --> WaitForResources"); 301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Pause */ 302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 302111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Pause --> Pause"); 302211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 302311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 302411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 302511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 302611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Invalid */ 302711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 302811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Pause --> Invalid"); 302911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 303011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 303111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 303211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState); 303311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 303411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 303511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 303611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 303711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is WaitForResources */ 303811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 303911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateWaitForResources) { 304011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Loaded */ 304111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateLoaded) { 304211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 304311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition */ 304411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded"); 304511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 304611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to WaitForResources */ 304711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 304811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources"); 304911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState, 305011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 305111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 305211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 305311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Executing */ 305411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateExecuting) { 305511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing"); 305611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 305711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 305811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 305911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 306011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Pause */ 306111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 306211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause"); 306311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 306411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 306511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 306611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 306711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Invalid */ 306811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 306911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid"); 307011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 307111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 307211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 307311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Loaded - 307411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is NOT tested by Khronos TS */ 307511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 307611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 307711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState); 307811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 307911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 308011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 308111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /********************************/ 308211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Invalid */ 308311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*******************************/ 308411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateInvalid) { 308511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* State Transition from Inavlid to any state */ 308611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == (OMX_StateLoaded || OMX_StateWaitForResources 308711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || OMX_StateIdle || OMX_StateExecuting 308811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || OMX_StatePause || OMX_StateInvalid)) { 308911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded"); 309011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorInvalidState,\ 309111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 309211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 309311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 309411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (cmd == OMX_CommandFlush) { 309511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued" 309611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "with param1: %u", (unsigned int)param1); 309711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 309811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel send_codec_config(); 309911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 310011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmd == OMX_CommandFlush && (param1 == OMX_CORE_INPUT_PORT_INDEX || 310111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel param1 == OMX_ALL)) { 310211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (android_atomic_add(0, &m_queued_codec_config_count) > 0) { 310311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct timespec ts; 310411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 310511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel clock_gettime(CLOCK_REALTIME, &ts); 310611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts.tv_sec += 2; 310711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("waiting for %d EBDs of CODEC CONFIG buffers ", 310811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queued_codec_config_count); 310911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_FLUSH_DEFERRED); 311011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (sem_timedwait(&m_safe_flush, &ts)) { 311111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to wait for EBDs of CODEC CONFIG buffers"); 311211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 311311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&m_flags,OMX_COMPONENT_FLUSH_DEFERRED); 311411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 311511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 311611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 311711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 311811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); 311911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 312011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 312111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 312211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 312311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) { 312411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 312511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set the Semaphore"); 312611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 312711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(param1); 312811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 312911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 313011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ( cmd == OMX_CommandPortEnable) { 313111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued" 313211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "with param1: %u", (unsigned int)param1); 313311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 313411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bEnabled = OMX_TRUE; 313511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 313611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (m_state == OMX_StateLoaded && 313711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 313811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || allocate_input_done()) { 313911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX, 314011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 314111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 314211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending"); 314311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING); 314411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 314511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 314611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 314711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 314811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 314911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Enable output Port command recieved"); 315011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bEnabled = OMX_TRUE; 315111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 315211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (m_state == OMX_StateLoaded && 315311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 315411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (allocate_output_done())) { 315511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX, 315611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 315711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 315811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 315911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending"); 316011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 316111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 316211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 316311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* enable/disable downscaling if required */ 316411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = decide_downscalar(); 316511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 316611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("decide_downscalar failed\n"); 316711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 316811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 316911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 317011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (cmd == OMX_CommandPortDisable) { 317111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued" 317211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "with param1: %u", (unsigned int)param1); 317311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 317411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_config_flag = false; 317511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bEnabled = OMX_FALSE; 317611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 317711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_input_done()) { 317811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX, 317911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 318011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 318111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING); 318211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 318311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) { 318411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 318511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 318611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 318711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX); 318811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 318911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 319011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 319111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 319211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 319311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 319411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 319511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bEnabled = OMX_FALSE; 319611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Disable output Port command recieved"); 319711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 319811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_output_done()) { 319911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\ 320011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 320111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 320211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 320311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 320411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) { 320511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 320611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 320711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 320811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 320911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX); 321011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 321111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 321211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 321311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 321411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 321511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 321611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 321711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd); 321811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNotImplemented; 321911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 322011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone && bFlag) { 322111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT); 322211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 322311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) { 322411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post(&m_cmd_lock); 322511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 322611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 322711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 322811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 322911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 323011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 323111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 323211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ExecuteOmxFlush 323311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 323411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 323511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Executes the OMX flush. 323611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 323711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 323811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flushtype - input flush(1)/output flush(0)/ both. 323911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 324011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 324111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 324211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 324311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 324411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_omx_flush(OMX_U32 flushType) 324511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 324611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 324711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane; 324811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer v4l2_buf; 324911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_decoder_cmd dec; 325011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("in %s, flushing %u", __func__, (unsigned int)flushType); 325111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 325211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH; 325311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("in %s: reconfig? %d", __func__, in_reconfig); 325511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (in_reconfig && flushType == OMX_CORE_OUTPUT_PORT_INDEX) { 325711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress = true; 325811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 325911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 326011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* XXX: The driver/hardware does not support flushing of individual ports 326111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * in all states. So we pretty much need to flush both ports internally, 326211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it 326311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * requested. Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set, 326411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * we automatically omit sending the FLUSH done for the "opposite" port. */ 326511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress = true; 326611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress = true; 326711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 326811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel request_perf_level(VIDC_TURBO); 326911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 327011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 327111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 327211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Flush Port (%u) Failed ", (unsigned int)flushType); 327311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = false; 327411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 327511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 327611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 327711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 327811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*========================================================================= 327911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_output_flush 328011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 328111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 328211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at OUTPUT PORT. 328311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 328411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 328511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone. 328611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 328711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 328811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false 328911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/ 329011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_output_flush() 329111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 329211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1 = 0; // Parameter - 1 329311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2 = 0; // Parameter - 2 329411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident = 0; 329511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = true; 329611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 329711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Generate FBD for all Buffers in the FTBq*/ 329811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 329911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Initiate Output Flush"); 330011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 330111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //reset last render TS 330211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_last_rendered_TS > 0) { 330311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_last_rendered_TS = 0; 330411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 330511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 330611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_ftb_q.m_size) { 330711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Buffer queue size %lu pending buf cnt %d", 330811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.m_size,pending_output_buffers); 330911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.pop_entry(&p1,&p2,&ident); 331011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ID(%lx) P1(%lx) P2(%lx)", ident, p1, p2); 331111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == m_fill_output_msg ) { 331211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)(intptr_t)p2); 331311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_FBD) { 331411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)(intptr_t)p1); 331511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 331611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 331711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 331811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress = false; 331911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 332011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 332111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = LLONG_MAX; 332211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = true; 332311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 332411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers); 332511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 332611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 332711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*========================================================================= 332811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_input_flush 332911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 333011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 333111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at INPUT PORT. 333211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 333311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 333411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone. 333511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 333611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 333711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false 333811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/ 333911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_input_flush() 334011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 334111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i =0; 334211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1 = 0; // Parameter - 1 334311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2 = 0; // Parameter - 2 334411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident = 0; 334511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = true; 334611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Generate EBD for all Buffers in the ETBq*/ 334811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Initiate Input Flush"); 334911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 335011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 335111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Check if the Queue is empty"); 335211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_etb_q.m_size) { 335311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.pop_entry(&p1,&p2,&ident); 335411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 335511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 335611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 335711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 335811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_ETB) { 335911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers++; 3360b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 336111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 336211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 336311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 336411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_EBD) { 336511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p", 336611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p1); 336711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 336811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 336911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 337011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.flush_timestamp(); 337111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if Heap Buffers are to be flushed*/ 337211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes && !(codec_config_flag)) { 337311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Reset all the variables before flusing"); 337411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 337511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count = 0; 337611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = false; 337711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count = 0; 337811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts = LLONG_MAX; 337911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_flags = 0; 338011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 338111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_entries = 0; 338211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Initialize parser"); 338311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils) { 338411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->initialize_frame_checking_environment(); 338511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 338611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 338711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_input_pending_q.m_size) { 338811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pending_q.pop_entry(&p1,&p2,&ident); 338911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1); 339011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 339111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 339211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame) { 339311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame); 339411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 339511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 339611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 339711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) { 339811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 339911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned int)NULL, 340011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)NULL); 340111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 340211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 340311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.flush(); 340411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (codec_config_flag) { 340511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer " 340611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "is not sent to the driver yet"); 340711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 340811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 340911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress = false; 341011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!arbitrary_bytes) { 341111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = LLONG_MAX; 341211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = true; 341311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 341411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 341511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_timestamp) { 341611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.reset_ts_list(); 341711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 341811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 341911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers); 342011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 342111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 342211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 342311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 342411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 342511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 342611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::SendCommandEvent 342711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 342811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 342911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Send the event to decoder pipe. This is needed to generate the callbacks 343011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel in decoder thread context. 343111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 343211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 343311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 343411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 343511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 343611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 343711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 343811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 343911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::post_event(unsigned long p1, 344011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2, 344111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long id) 344211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 344311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 344411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 344511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Just drop messages typically generated by hardware (w/o client request), 344611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * if we've reported an error to client. */ 344711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_error_propogated) { 344811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (id) { 344911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 345011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 345111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Dropping message %lx " 345211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "since client expected to be in error state", id); 345311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 345411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 345511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* whatever */ 345611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 345711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 345811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 345911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 346111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (id == m_fill_output_msg || 346311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_FBD || 346411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_PORT_RECONFIG || 346511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH) { 346611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.insert_entry(p1,p2,id); 346711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (id == OMX_COMPONENT_GENERATE_ETB || 346811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_EBD || 346911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY || 347011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH) { 347111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.insert_entry(p1,p2,id); 347211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 347311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cmd_q.insert_entry(p1,p2,id); 347411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 347511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 347611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 347711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this); 347811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_message(this, id); 347911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 348011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 348111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 348211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 348311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 348411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 348511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) 348611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 348711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 348811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!profileLevelType) 348911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 349011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 349111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nPortIndex == 0) { 349211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 3493d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel52; 349411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 349511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 349611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 349711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 349811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 2) { 349911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 350011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 3) { 350111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedBaseline; 350211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 4) { 350311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedHigh; 350411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 350511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 350611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 350711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 350811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 350911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 351011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 351111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = QOMX_VIDEO_MVCProfileStereoHigh; 351211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = QOMX_VIDEO_MVCLevel51; 351311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 351411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 351511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 351611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 351711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 351811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 351911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 352011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain; 352111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_HEVCMainTierLevel51; 352211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 352311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain10; 352411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_HEVCMainTierLevel51; 352511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 352611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 352711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 352811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 352911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 353011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) { 353111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 353211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline; 353311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_H263Level70; 353411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 353511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 353611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 353711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 353811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 353911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 354011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 354111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 354211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 354311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 354411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 354511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 354611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 354711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 354811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 354911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 355011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 355111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE) || 355211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) { 355311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 355411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 355511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 355611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple; 355711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 355811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 355911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain; 356011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 356111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 356211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 356311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 356411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 356511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 356611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 356711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore for codec: %s", drv_ctx.kind); 356811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 356911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 357011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 357111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %u", 357211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nPortIndex); 357311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 357411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 357511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 357611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 357711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 357811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 357911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 358011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::GetParameter 358111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 358211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 358311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Get Parameter method implementation 358411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 358511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 358611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 358711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 358811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 358911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Error None if successful. 359011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 359111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 359211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp, 359311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE paramIndex, 359411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_PTR paramData) 359511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 359611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 359711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 359811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 359911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter:"); 360011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 360111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Param in Invalid State"); 360211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 360311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 360411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (paramData == NULL) { 360511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Get Param in Invalid paramData"); 360611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 360711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 360811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((unsigned long)paramIndex) { 360911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPortDefinition: { 361011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE); 361111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *portDefn = 361211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 361311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition"); 361411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel decide_dpb_buffer_mode(is_down_scalar_enabled); 361511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = update_portdef(portDefn); 361611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) 361711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_def = *portDefn; 361811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 361911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 362011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoInit: { 362111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 362211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *portParamType = 362311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) paramData; 362411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit"); 362511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portParamType->nVersion.nVersion = OMX_SPEC_VERSION; 362711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE); 362811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portParamType->nPorts = 2; 362911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portParamType->nStartPortNumber = 0; 363011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 363111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 363211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoPortFormat: { 363311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE); 363411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 363511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 363611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat"); 363711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 363811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->nVersion.nVersion = OMX_SPEC_VERSION; 363911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->nSize = sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE); 364011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 364111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == portFmt->nPortIndex) { 364211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == portFmt->nIndex) { 364311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat = OMX_COLOR_FormatUnused; 364411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eCompressionFormat = eCompressionFormat; 364511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 364611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\ 364711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " NoMore compression formats"); 364811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 364911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 365011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (1 == portFmt->nPortIndex) { 365111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 365211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 365311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Distinguish non-surface mode from normal playback use-case based on 365411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // usage hinted via "OMX.google.android.index.useAndroidNativeBuffer2" 365511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // For non-android, use the default list 365611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Also use default format-list if FLEXIBLE YUV is supported, 365711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // as the client negotiates the standard color-format if it needs to 365811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool useNonSurfaceMode = false; 365911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_) && !defined(FLEXYUV_SUPPORTED) 366011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel useNonSurfaceMode = (m_enable_android_native_buffers == OMX_FALSE); 366111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 366211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_thulium_v1) { 366311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat = getPreferredColorFormatDefaultMode(portFmt->nIndex); 366411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 366511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat = useNonSurfaceMode ? 366611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel getPreferredColorFormatNonSurfaceMode(portFmt->nIndex) : 366711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel getPreferredColorFormatDefaultMode(portFmt->nIndex); 366811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 366911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 367011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portFmt->eColorFormat == OMX_COLOR_FormatMax ) { 367111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 367211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\ 367311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " NoMore Color formats"); 367411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 367511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("returning color-format: 0x%x", portFmt->eColorFormat); 367611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 367711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: Bad port index %d", 367811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portFmt->nPortIndex); 367911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 368011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 368111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 368211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 368311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Component should support this port definition*/ 368411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamAudioInit: { 368511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 368611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *audioPortParamType = 368711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) paramData; 368811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit"); 368911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 369011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel audioPortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE); 369111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel audioPortParamType->nPorts = 0; 369211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel audioPortParamType->nStartPortNumber = 0; 369311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 369411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 369511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Component should support this port definition*/ 369611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamImageInit: { 369711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 369811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *imagePortParamType = 369911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) paramData; 370011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit"); 370111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 370211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel imagePortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE); 370311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel imagePortParamType->nPorts = 0; 370411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel imagePortParamType->nStartPortNumber = 0; 370511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 370611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 370711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 370811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Component should support this port definition*/ 370911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamOtherInit: { 371011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x", 371111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 371211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedIndex; 371311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 371411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 371511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamStandardComponentRole: { 371611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE); 371711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_COMPONENTROLETYPE *comp_role; 371811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 371911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role->nVersion.nVersion = OMX_SPEC_VERSION; 372011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role->nSize = sizeof(*comp_role); 372111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 372211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d", 372311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 372411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)comp_role->cRole,(const char*)m_cRole, 372511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE); 372611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 372711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 372811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Added for parameter test */ 372911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPriorityMgmt: { 373011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE); 373111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PRIORITYMGMTTYPE *priorityMgmType = 373211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PRIORITYMGMTTYPE *) paramData; 373311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt"); 373411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION; 373511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel priorityMgmType->nSize = sizeof(OMX_PRIORITYMGMTTYPE); 373611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 373711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 373811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 373911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Added for parameter test */ 374011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamCompBufferSupplier: { 374111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE); 374211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = 374311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 374411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier"); 374511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 374611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->nSize = sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE); 374711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION; 374811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == bufferSupplierType->nPortIndex) 374911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 375011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (1 == bufferSupplierType->nPortIndex) 375111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 375211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 375311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 375411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 375511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 375611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 375711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 375811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoAvc: { 375911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x", 376011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 376111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 376211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 376311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: { 376411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: QOMX_IndexParamVideoMvc %08x", 376511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 376611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 376711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 376811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoH263: { 376911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x", 377011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 377111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 377211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 377311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg4: { 377411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x", 377511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 377611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 377711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 377811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg2: { 377911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x", 378011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 378111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 378211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 378311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoProfileLevelQuerySupported: { 378411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE); 378511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex); 378611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType = 378711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData; 378811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_supported_profile_level(profileLevelType); 378911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 379011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 379111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 379211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: { 379311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, GetAndroidNativeBufferUsageParams); 379411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage"); 379511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData; 379611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 379711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 379811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode && !secure_scaling_to_non_secure_opb) { 379911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED | 380011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel GRALLOC_USAGE_PRIVATE_UNCACHED); 380111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 380211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_UNCACHED; 380311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 380411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 380511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!"); 380611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 380711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 380811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 380911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 381011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 381111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 381211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FLEXYUV_SUPPORTED 381311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexFlexibleYUVDescription: { 381411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: describeColorFormat"); 381511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, DescribeColorFormatParams); 381611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = describeColorFormat(paramData); 381711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 381811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 381911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 382011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoProfileLevelCurrent: { 382111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE); 382211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData; 382311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control profile_control, level_control; 382411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 382511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (drv_ctx.decoder_format) { 382611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_CODECTYPE_H264: 382711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE; 382811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel level_control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL; 382911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 383011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 383111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_param of OMX_IndexParamVideoProfileLevelCurrent only available for H264"); 383211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNotImplemented; 383311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 383411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 383511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 383611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &profile_control)) { 383711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((enum v4l2_mpeg_video_h264_profile)profile_control.value) { 383811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE: 383911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE: 384011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile = OMX_VIDEO_AVCProfileBaseline; 384111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 384211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN: 384311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile = OMX_VIDEO_AVCProfileMain; 384411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 384511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED: 384611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile = OMX_VIDEO_AVCProfileExtended; 384711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 384811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH: 384911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile = OMX_VIDEO_AVCProfileHigh; 385011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 385111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10: 385211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile = OMX_VIDEO_AVCProfileHigh10; 385311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 385411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422: 385511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile = OMX_VIDEO_AVCProfileHigh422; 385611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 385711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE: 385811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA: 385911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA: 386011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA: 386111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA: 386211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE: 386311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH: 386411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA: 386511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH: 386611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH: 386711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH: 386811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 386911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 387011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 387111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 387211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 387311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 387411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 387511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 387611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &level_control)) { 387711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((enum v4l2_mpeg_video_h264_level)level_control.value) { 387811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1_0: 387911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel1; 388011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 388111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1B: 388211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel1b; 388311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 388411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1_1: 388511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel11; 388611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 388711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1_2: 388811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel12; 388911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 389011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1_3: 389111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel13; 389211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 389311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_2_0: 389411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel2; 389511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 389611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_2_1: 389711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel21; 389811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 389911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_2_2: 390011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel22; 390111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 390211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_3_0: 390311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel3; 390411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 390511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_3_1: 390611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel31; 390711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 390811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_3_2: 390911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel32; 391011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 391111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_4_0: 391211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel4; 391311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 391411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_4_1: 391511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel41; 391611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 391711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_4_2: 391811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel42; 391911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 392011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_5_0: 392111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel5; 392211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 392311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_5_1: 392411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel51; 3925d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel break; 392611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_5_2: 392711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel52; 392811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 392911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 393011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 393111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 393211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 393311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 393411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 393511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 393611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 39372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel case OMX_QTIIndexParamVideoClientExtradata: 39382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel { 39392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CLIENT_EXTRADATATYPE); 39402601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QTIIndexParamVideoClientExtradata"); 39412601808ee2992a94c325d05e4065aba60b01840bThierry Strudel QOMX_VIDEO_CLIENT_EXTRADATATYPE *pParam = 39422601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (QOMX_VIDEO_CLIENT_EXTRADATATYPE *)paramData; 39432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel pParam->nExtradataSize = VENUS_EXTRADATA_SIZE(4096, 2160); 39442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel pParam->nExtradataAllocSize = pParam->nExtradataSize * MAX_NUM_INPUT_OUTPUT_BUFFERS; 39452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel eRet = OMX_ErrorNone; 39462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 39472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 3948af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel case OMX_QTIIndexParamDitherControl: 3949af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel { 3950af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DITHER_CONTROL); 3951af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel DEBUG_PRINT_LOW("get_parameter: QOMX_VIDEO_DITHER_CONTROL"); 3952af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel QOMX_VIDEO_DITHER_CONTROL *pParam = 3953af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel (QOMX_VIDEO_DITHER_CONTROL *) paramData; 3954af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel pParam->eDitherType = (QOMX_VIDEO_DITHERTYPE) m_dither_config; 3955af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel eRet = OMX_ErrorNone; 3956af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel break; 3957af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } 395811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: { 395911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex); 396011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedIndex; 396111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 396211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 396311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 396411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 396511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)", 396611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width, 396711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height, 396811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.stride, 396911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.scan_lines); 397011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 397111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 397211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 397311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 397411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 397511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data) 397611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 397711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside use_android_native_buffer"); 397811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 397911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data; 398011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 398111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((params == NULL) || 398211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (params->nativeBuffer == NULL) || 398311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (params->nativeBuffer->handle == NULL) || 398411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !m_enable_android_native_buffers) 398511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 398611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_android_native_buffers = OMX_TRUE; 398711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sp<android_native_buffer_t> nBuf = params->nativeBuffer; 398811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = (private_handle_t *)nBuf->handle; 398911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port 399011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *buffer = NULL; 399111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 399211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer = (OMX_U8*)mmap(0, handle->size, 399311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 399411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == MAP_FAILED) { 399511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 399611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 399711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 399811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 399911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer); 400011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 400111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 400211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 400311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 400411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 400511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 400611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 400711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::enable_smoothstreaming() { 400811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 400911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 401011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER; 401111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 401211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 401311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 401411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver."); 401511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 401611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 401711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_mode = true; 401811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 401911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 402011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 402111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 402211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 402311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::Setparameter 402411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 402511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 402611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Set Parameter method implementation. 402711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 402811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 402911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 403011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 403111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 403211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if successful. 403311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 403411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 403511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, 403611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE paramIndex, 403711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR paramData) 403811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 403911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 404011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret=0; 404111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 404211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 404311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char property_value[PROPERTY_VALUE_MAX] = {0}; 404411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 404511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 404611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Param in Invalid State"); 404711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 404811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 404911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (paramData == NULL) { 405011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Param in Invalid paramData"); 405111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 405211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 405311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state != OMX_StateLoaded) && 405411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) && 405511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_out_bEnabled == OMX_TRUE) && 405611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) && 405711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_inp_bEnabled == OMX_TRUE)) { 405811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Param in Invalid State"); 405911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 406011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 406111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((unsigned long)paramIndex) { 406211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPortDefinition: { 406311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE); 406411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 406511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 406611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has 406711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //been called. 406811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d", 406911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->format.video.nFrameHeight, 407011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->format.video.nFrameWidth); 407111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4072fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) { 407311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Buffers requested exceeds max limit %d", 407411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual); 407511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 407611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 407711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 407811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_DirOutput == portDefn->eDir) { 407911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port"); 408011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool port_format_changed = false; 408111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_display_id = portDefn->format.video.pNativeWindow; 408211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int buffer_size; 408311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* update output port resolution with client supplied dimensions 408411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel in case scaling is enabled, else it follows input resolution set 408511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 408611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel decide_dpb_buffer_mode(is_down_scalar_enabled); 408711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_down_scalar_enabled) { 408811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("SetParam OP: WxH(%u x %u)", 408911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameWidth, 409011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameHeight); 409111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->format.video.nFrameHeight != 0x0 && 409211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth != 0x0) { 409311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 409411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 409511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 409611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 409711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 409811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Resolution failed"); 409911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 410011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 410111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 410211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((portDefn->format.video.nFrameHeight != (unsigned int)fmt.fmt.pix_mp.height) || 410311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (portDefn->format.video.nFrameWidth != (unsigned int)fmt.fmt.pix_mp.width)) { 410411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel port_format_changed = true; 410511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 410611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 410711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* set crop info */ 410811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nLeft = 0; 410911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nTop = 0; 411011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nWidth = portDefn->format.video.nFrameWidth; 411111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nHeight = portDefn->format.video.nFrameHeight; 411211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4113fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nLeft = 0; 4114fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nTop = 0; 4115fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nWidth = rectangle.nWidth; 4116fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nHeight = rectangle.nHeight; 4117fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 411811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = is_video_session_supported(); 411911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet) 412011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 412111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 412211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 41232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.height = (unsigned int)portDefn->format.video.nFrameHeight; 41242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.width = (unsigned int)portDefn->format.video.nFrameWidth; 412511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 412611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d", 412711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height, fmt.fmt.pix_mp.width); 412811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 412911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 413011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Resolution failed"); 413111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 413211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 413311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 413411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 413511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 413611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet) { 413711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 413811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 413911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 414011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode) { 414111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 414211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE_SCALING_THRESHOLD; 414311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) { 414411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed getting secure scaling threshold : %d, id was : %x", errno, control.id); 414511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 414611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 414711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* This is a workaround for a bug in fw which uses stride 414811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * and slice instead of width and height to check against 414911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * the threshold. 415011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 415111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 stride, slice; 415211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) { 415311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, portDefn->format.video.nFrameWidth); 415411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12, portDefn->format.video.nFrameHeight); 415511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) { 415611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameWidth); 415711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameHeight); 4158b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) { 4159b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, portDefn->format.video.nFrameWidth); 4160b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, portDefn->format.video.nFrameHeight); 416111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 416211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = portDefn->format.video.nFrameWidth; 416311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel slice = portDefn->format.video.nFrameHeight; 416411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 416511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 416611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Stride is %d, slice is %d, sxs is %d\n", stride, slice, stride * slice); 416711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Threshold value is %d\n", control.value); 416811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 416911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (stride * slice <= (OMX_U32)control.value) { 417011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_scaling_to_non_secure_opb = true; 417111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enabling secure scalar out of CPZ"); 417211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_NON_SECURE_OUTPUT2; 417311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 417411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) { 417511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Enabling non-secure output2 failed"); 417611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 417711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 417811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 417911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 418011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 418111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 418211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 418311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet) { 418411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 418511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 418611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 418711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) { 418811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Requested o/p buf count (%u) exceeds limit (%u)", 418911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS); 419011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 419111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!client_buffers.get_buffer_req(buffer_size)) { 419211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error in getting buffer requirements"); 419311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 419411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!port_format_changed) { 419511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4196fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Buffer count can change only when port is unallocated 4197fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_out_mem_ptr && 4198fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel (portDefn->nBufferCountActual != drv_ctx.op_buf.actualcount || 4199fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel portDefn->nBufferSize != drv_ctx.op_buf.buffer_size)) { 4200fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 420111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Cannot change o/p buffer count since all buffers are not freed yet !"); 420211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 420311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 420411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 420511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // route updating of buffer requirements via c2d proxy. 420711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Based on whether c2d is enabled, requirements will be handed 420811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // to the vidc driver appropriately 420911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = client_buffers.set_buffer_req(portDefn->nBufferSize, 421011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual); 421111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 421211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_def = *portDefn; 421311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 421411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%u: %u)", 421511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.mincount, (unsigned int)buffer_size, 421611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize); 421711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 421811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 421911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 422011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (OMX_DirInput == portDefn->eDir) { 422111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port"); 422211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool port_format_changed = false; 422311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((portDefn->format.video.xFramerate >> 16) > 0 && 422411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) { 422511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Frame rate only should be set if this is a "known value" or to 422611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // activate ts prediction logic (arbitrary mode only) sending input 422711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // timestamps with max value (LLONG_MAX). 4228fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_fps_received = portDefn->format.video.xFramerate; 422911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %u", 423011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.xFramerate >> 16); 423111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator, 423211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator); 423311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.frame_rate.fps_numerator) { 423411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 423511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = 30; 423611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 423711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.frame_rate.fps_denominator) 423811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = (int) 423911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 424011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator = 1; 424111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 424211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator; 424311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)", 424411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator / 424511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (float)drv_ctx.frame_rate.fps_denominator); 424611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 424711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_outputparm oparm; 424811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*XXX: we're providing timing info as seconds per frame rather than frames 424911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * per second.*/ 425011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 425111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 425211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 425311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_streamparm sparm; 425411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 425511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.parm.output = oparm; 425611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) { 425711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unable to convey fps info to driver, performance might be affected"); 425811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 425911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 426011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 426111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_control.request_cores(frm_int); 426211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 426311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 426411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.video_resolution.frame_height != 426511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameHeight || 426611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width != 426711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth) { 426811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("SetParam IP: WxH(%u x %u)", 426911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameWidth, 427011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameHeight); 427111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel port_format_changed = true; 427211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 frameWidth = portDefn->format.video.nFrameWidth; 427311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 frameHeight = portDefn->format.video.nFrameHeight; 427411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frameHeight != 0x0 && frameWidth != 0x0) { 427511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_smoothstreaming_mode && 427611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((frameWidth * frameHeight) < 427711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_smoothstreaming_width * m_smoothstreaming_height))) { 427811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameWidth = m_smoothstreaming_width; 427911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameHeight = m_smoothstreaming_height; 428011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("NOTE: Setting resolution %u x %u " 428111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "for adaptive-playback/smooth-streaming", 428211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)frameWidth, (unsigned int)frameHeight); 428311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 4284fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 4285fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nLeft = 0; 4286fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nTop = 0; 4287fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nWidth = frameWidth; 4288fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nHeight = frameHeight; 4289fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 429011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel update_resolution(frameWidth, frameHeight, 429111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameWidth, frameHeight); 429211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = is_video_session_supported(); 429311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet) 429411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 42952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (is_down_scalar_enabled) { 42962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 42972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 42982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 42992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 43002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 43012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("DS Enabled : height = %d , width = %d", 43022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width); 43032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 43042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } else { 43052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 43062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 43072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 43082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 43092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 43102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("DS Disabled : height = %d , width = %d", 43112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width); 43122601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 43132601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 43142601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 43152601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 43162601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 431711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 431811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Resolution failed"); 431911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 432011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 432111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!is_down_scalar_enabled) 432211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 432311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 432411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 432511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 432611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_custom_buffersize.input_buffersize 432711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && (portDefn->nBufferSize > m_custom_buffersize.input_buffersize)) { 432811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Custom buffer size set by client: %d, trying to set: %d", 432911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_custom_buffersize.input_buffersize, portDefn->nBufferSize); 433011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 433111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 433211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 433311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) { 433411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Requested i/p buf count (%u) exceeds limit (%u)", 433511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS); 433611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 433711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 433811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 4339fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Buffer count can change only when port is unallocated 4340fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_inp_mem_ptr && 4341fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel (portDefn->nBufferCountActual != drv_ctx.ip_buf.actualcount || 4342fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size)) { 434311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Cannot change i/p buffer count since all buffers are not freed yet !"); 434411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 434511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 434611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 434711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 434811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount 434911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) { 435011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel port_format_changed = true; 435111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf; 435211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual; 435311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) & 435411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (~(buffer_prop->alignment - 1)); 435511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_buffer_req(buffer_prop); 435611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 435711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (false == port_format_changed) { 435811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%u: %u)", 435911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.mincount, (unsigned int)drv_ctx.ip_buf.buffer_size, 436011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize); 436111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 436211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 436311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (portDefn->eDir == OMX_DirMax) { 436411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d", 436511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->nPortIndex); 436611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 436711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 436811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 436911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 437011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoPortFormat: { 437111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE); 437211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 437311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 437411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret=0; 437511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 437611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat 0x%x, port: %u", 437711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat, (unsigned int)portFmt->nPortIndex); 437811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 437911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 438011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (1 == portFmt->nPortIndex) { 438111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 43822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 43832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (ret < 0) { 43842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__); 43852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return OMX_ErrorBadParameter; 43862601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 438711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum vdec_output_fromat op_format; 438811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 43892601808ee2992a94c325d05e4065aba60b01840bThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m || 439011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 43912601808ee2992a94c325d05e4065aba60b01840bThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView || 439211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar || 439311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) { 439411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12; 439511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 43962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) { 439711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12_UBWC; 439811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 439911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 440011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 440111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 44022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) { 440311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12_UBWC; 440411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 440511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12; 440611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 440711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 440811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 440911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_format = op_format; 441011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 441111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 441211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set output format failed"); 441311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 441411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 441511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 441611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 441711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 441811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 441911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 442011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_buffers.set_color_format(portFmt->eColorFormat)) { 442111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set color format failed"); 442211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 442311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 442411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 442511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 442611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 442711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 442811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 442911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexPortDefn: { 443011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PARAM_PORTDEFINITIONTYPE); 443111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt = 443211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData; 443311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %u", 443411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portFmt->nFramePackingFormat); 443511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 443611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Input port */ 443711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portFmt->nPortIndex == 0) { 4438fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // arbitrary_bytes mode cannot be changed arbitrarily since this controls how: 4439fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // - headers are allocated and 4440fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // - headers-indices are derived 4441fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Avoid changing arbitrary_bytes when the port is already allocated 4442fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_inp_mem_ptr) { 4443fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Cannot change arbitrary-bytes-mode since input port is not free!"); 4444fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 4445fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 444611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) { 444711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode || m_input_pass_buffer_fd) { 444811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 444911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode"); 445011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 445111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 445211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = true; 445311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 445411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (portFmt->nFramePackingFormat == 445511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_FramePacking_OnlyOneCompleteFrame) { 445611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 445711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 445811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0"); 445911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(property_value)) { 446011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("arbitrary_bytes enabled via property command"); 446111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = true; 446211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 446311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 446411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 446511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %u", 446611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portFmt->nFramePackingFormat); 446711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 446811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 446911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 447011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port"); 447111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid && 447211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->nMemRegion < OMX_QCOM_MemRegionMax) && 447311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) { 447411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_region_smi = OMX_TRUE; 447511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 447611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set"); 447711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_output_pmem = OMX_TRUE; 447811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 447911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 448011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 448111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 448211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_thulium_v1 && !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", 448311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 448411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = true; 448511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Force arbitrary_bytes to true for h264"); 448611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 448711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 448811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 448911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamStandardComponentRole: { 449011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE); 449111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_COMPONENTROLETYPE *comp_role; 449211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 449311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s", 449411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role->cRole); 449511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 449611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state == OMX_StateLoaded)&& 449711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags, OMX_COMPONENT_IDLE_PENDING)) { 449811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set Parameter called in valid state"); 449911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 450011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 450111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 450211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 450311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 450411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE)) { 450511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((char*)comp_role->cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE)) { 450611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE); 450711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 450811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 450911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedSetting; 451011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 451111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 451211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((char*)comp_role->cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 451311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE); 451411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 451511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 451611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 451711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 451811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) { 451911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) { 452011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE); 452111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 452211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 452311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 452411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 452511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) { 452611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE)) { 452711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE); 452811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 452911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 453011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedSetting; 453111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 453211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) { 453311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) { 453411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE); 453511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 453611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 453711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 453811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 453911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx", OMX_MAX_STRINGNAME_SIZE)) || 454011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311", OMX_MAX_STRINGNAME_SIZE)) || 454111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4", OMX_MAX_STRINGNAME_SIZE)) 454211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) { 454311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE)) { 454411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE); 454511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 454611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 454711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedSetting; 454811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 454911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) || 455011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE)) 455111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) { 455211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) { 455311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE); 455411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 455511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 455611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedSetting; 455711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 455811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) { 455911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE) || 456011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) { 456111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE); 456211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 456311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 456411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 456511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 456611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { 456711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE) || 456811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) { 456911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE); 457011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 457111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 457211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 457311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 457411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 457511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 457611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE); 457711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 457811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 457911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 458011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 458111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 458211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind); 458311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidComponentName; 458411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 458511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 458611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 458711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 458811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPriorityMgmt: { 458911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE); 459011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateLoaded) { 459111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 459211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 459311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 459411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData; 459511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %u", 459611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)priorityMgmtype->nGroupID); 459711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 459811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %u", 459911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)priorityMgmtype->nGroupPriority); 460011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 460111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_priority_mgm.nGroupID = priorityMgmtype->nGroupID; 460211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority; 460311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 460411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 460511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 460611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 460711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamCompBufferSupplier: { 460811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE); 460911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 461011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d", 461111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->eBufferSupplier); 461211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1) 461311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier; 461411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 461511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 461611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 461711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 461811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 461911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 462011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 462111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 462211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoAvc: { 462311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d", 462411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 462511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 462611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 462711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: { 462811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: QOMX_IndexParamVideoMvc %d", 462911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 463011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 463111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 463211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoH263: { 463311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d", 463411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 463511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 463611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 463711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg4: { 463811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d", 463911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 464011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 464111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 464211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg2: { 464311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d", 464411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 464511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 464611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 464711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamLowLatencyMode: { 464811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 464911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 465011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE* pParam = 465111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE*)paramData; 465211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->bLowLatencyMode) { 465311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enabling DECODE order"); 465411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.set_timestamp_reorder_mode(false); 465511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 465611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 465711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 465811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 465911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set picture order failed"); 466011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 466111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 466211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 466311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 466411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 466511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoDecoderPictureOrder: { 466611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DECODER_PICTURE_ORDER); 466711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder = 466811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData; 466911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 467011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pic_order,rc=0; 467111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d", 467211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pictureOrder->eOutputPictureOrder); 467311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) { 467411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 467511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) { 467611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 467711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.set_timestamp_reorder_mode(false); 467811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 467911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 468011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 468111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 468211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = pic_order; 468311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 468411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 468511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set picture order failed"); 468611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 468711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 468811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 468911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 469011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 469111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamConcealMBMapExtraData: 469211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 469311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false, 469411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 469511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 469611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamFrameInfoExtraData: 469711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 469811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false, 469911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 470011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 470111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_ExtraDataFrameDimension: 470211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 470311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_FRAMEDIMENSION_EXTRADATA, false, 470411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 470511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 470611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamInterlaceExtraData: 470711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 470811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false, 470911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 471011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 471111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamH264TimeInfo: 471211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 471311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false, 471411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 471511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 471611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoFramePackingExtradata: 471711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 471811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_FRAMEPACK_EXTRADATA, false, 471911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 472011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 472111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoQPExtraData: 472211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 472311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_QP_EXTRADATA, false, 472411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 472511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 472611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoInputBitsInfoExtraData: 472711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 472811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_BITSINFO_EXTRADATA, false, 472911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 473011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 473111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexEnableExtnUserData: 473211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 473311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_EXTNUSER_EXTRADATA, false, 473411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 473511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 473611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamVQZipSEIExtraData: 473711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 473811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false, 473911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 474011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 474111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoDivx: { 474211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData; 474311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 474411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 474511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexPlatformPvt: { 474611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PLATFORMPRIVATE_EXTN); 474711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port"); 474811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData; 474911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 475011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type); 475111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 475211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 475311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_pvt_entry_pmem = OMX_TRUE; 475411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 475511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set"); 475611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_output_pmem = OMX_TRUE; 475711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 475811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 475911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 476011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 476111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 476211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoSyncFrameDecodingMode: { 476311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode"); 476411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode"); 476511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 476611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 476711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.idr_only_decoding = 1; 476811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 476911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 477011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 477111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 477211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set picture order failed"); 477311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 477411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 477511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE; 477611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE; 477711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 477811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 477911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Sync frame setting failed"); 478011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 478111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 478211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Setting sync frame decoding on driver might change buffer 478311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * requirements so update them here*/ 478411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (get_buffer_req(&drv_ctx.ip_buf)) { 478511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer i/p requirements"); 478611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 478711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 478811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (get_buffer_req(&drv_ctx.op_buf)) { 478911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer o/p requirements"); 479011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 479111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 479211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 479311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 479411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 479511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 479611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamIndexExtraDataType: { 479711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXEXTRADATATYPE); 479811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData; 479911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) && 480011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (extradataIndexType->bEnabled == OMX_TRUE) && 480111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (extradataIndexType->nPortIndex == 1)) { 480211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming"); 480311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled); 480411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 480511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 480611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 480711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 480811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamEnableSmoothStreaming: { 480911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef SMOOTH_STREAMING_DISABLED 481011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_smoothstreaming(); 481111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 481211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 481311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 481411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 481511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 481611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 481711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Need to allow following two set_parameters even in Idle 481811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * state. This is ANDROID architecture which is not in sync 481911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * with openmax standard. */ 482011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: { 482111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, EnableAndroidNativeBuffersParams); 482211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData; 4823fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (enableNativeBuffers->nPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) { 4824fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers allowed only on output port!"); 4825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel eRet = OMX_ErrorUnsupportedSetting; 4826fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4827fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (m_out_mem_ptr) { 4828fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers is not allowed since Output port is not free !"); 4829fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel eRet = OMX_ErrorInvalidState; 4830fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4831fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 483211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enableNativeBuffers) { 483311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_enable_android_native_buffers = enableNativeBuffers->enable; 483411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 483511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if !defined(FLEXYUV_SUPPORTED) 483611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 483711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Use the most-preferred-native-color-format as surface-mode is hinted here 483811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!client_buffers.set_color_format(getPreferredColorFormatDefaultMode(0))) { 483911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set native color format!"); 484011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 484111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 484211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 484311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 484411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 484511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 484611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: { 484711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, UseAndroidNativeBufferParams); 484811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = use_android_native_buffer(hComp, paramData); 484911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 485011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 485111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if ALLOCATE_OUTPUT_NATIVEHANDLE 485211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexAllocateNativeHandle: { 4853fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 485411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel AllocateNativeHandleParams* allocateNativeHandleParams = (AllocateNativeHandleParams *) paramData; 4855fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, AllocateNativeHandleParams); 4856fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4857fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (allocateNativeHandleParams->nPortIndex != OMX_CORE_INPUT_PORT_INDEX) { 4858fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle allowed only on input port!"); 4859fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel eRet = OMX_ErrorUnsupportedSetting; 4860fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4861fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (m_inp_mem_ptr) { 4862fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle is not allowed since Input port is not free !"); 4863fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel eRet = OMX_ErrorInvalidState; 4864fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4865fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4866fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 486711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocateNativeHandleParams != NULL) { 486811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocate_native_handle = allocateNativeHandleParams->enable; 486911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 487011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 487111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 487211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //ALLOCATE_OUTPUT_NATIVEHANDLE 487311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 487411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamEnableTimeStampReorder: { 487511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXTIMESTAMPREORDER); 487611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData; 487711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) { 487811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (reorder->bEnable == OMX_TRUE) { 487911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int =0; 488011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.set_timestamp_reorder_mode(true); 488111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 488211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.set_timestamp_reorder_mode(false); 488311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 488411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.set_timestamp_reorder_mode(false); 488511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (reorder->bEnable == OMX_TRUE) { 488611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 488711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 488811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 488911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 489011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 489111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoProfileLevelCurrent: { 489211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE); 489311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = 489411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData; 489511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam) { 489611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile_lvl.eProfile = pParam->eProfile; 489711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile_lvl.eLevel = pParam->eLevel; 489811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 489911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 490011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 490111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 490211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoMetaBufferMode: 490311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 490411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, StoreMetaDataInBuffersParams); 490511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel StoreMetaDataInBuffersParams *metabuffer = 490611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (StoreMetaDataInBuffersParams *)paramData; 490711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!metabuffer) { 490811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid param: %p", metabuffer); 490911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 491011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 491111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 491211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_disable_dynamic_buf_mode) { 491311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Dynamic buffer mode is disabled"); 491411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 491511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 491611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 491711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (metabuffer->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 4918fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4919fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_out_mem_ptr) { 4920fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Enable/Disable dynamic-buffer-mode is not allowed since Output port is not free !"); 4921fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel eRet = OMX_ErrorInvalidState; 4922fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4923fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 492411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //set property dynamic buffer mode to driver. 492511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 492611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 492711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_ALLOC_MODE_OUTPUT; 492811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (metabuffer->bStoreMetaData == true) { 492911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_DYNAMIC; 493011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 493111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_STATIC; 493211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 493311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 493411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!rc) { 493511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("%s buffer mode", 493611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (metabuffer->bStoreMetaData == true)? "Enabled dynamic" : "Disabled dynamic"); 493711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dynamic_buf_mode = metabuffer->bStoreMetaData; 493811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 493911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to %s buffer mode", 494011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (metabuffer->bStoreMetaData == true)? "enable dynamic" : "disable dynamic"); 494111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 494211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 494311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 494411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR( 494511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_QcomIndexParamVideoMetaBufferMode not supported for port: %u", 494611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)metabuffer->nPortIndex); 494711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 494811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 494911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 495011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 495111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoDownScalar: 495211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 495311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXDOWNSCALAR); 495411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_INDEXDOWNSCALAR* pParam = (QOMX_INDEXDOWNSCALAR*)paramData; 495511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 495611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 495711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoDownScalar %d\n", pParam->bEnable); 495811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 495911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam && pParam->bEnable) { 496011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = enable_downscalar(); 496111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 496211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__); 496311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 496411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 496511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_force_down_scalar = pParam->bEnable; 496611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 496711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = disable_downscalar(); 496811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 496911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__); 497011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 497111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 497211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_force_down_scalar = pParam->bEnable; 497311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 497411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 497511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 497611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED 497711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoAdaptivePlaybackMode: 497811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 497911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, PrepareForAdaptivePlaybackParams); 498011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_GoogleAndroidIndexPrepareForAdaptivePlayback"); 498111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PrepareForAdaptivePlaybackParams* pParams = 498211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (PrepareForAdaptivePlaybackParams *) paramData; 498311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParams->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 498411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pParams->bEnable) { 498511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 498611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 498711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParams->nMaxFrameWidth > maxSmoothStreamingWidth 498811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || pParams->nMaxFrameHeight > maxSmoothStreamingHeight) { 498911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR( 499011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "Adaptive playback request exceeds max supported resolution : [%u x %u] vs [%u x %u]", 499111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pParams->nMaxFrameWidth, (unsigned int)pParams->nMaxFrameHeight, 499211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)maxSmoothStreamingWidth, (unsigned int)maxSmoothStreamingHeight); 499311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 499411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 499511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_adaptive_playback(pParams->nMaxFrameWidth, pParams->nMaxFrameHeight); 499611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 499711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 499811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR( 499911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "Prepare for adaptive playback supported only on output port"); 500011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 500111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 500211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 500311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 500411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 500511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamVideoPreferAdaptivePlayback: 500611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 500711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 500811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoPreferAdaptivePlayback"); 500911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disable_dynamic_buf_mode = ((QOMX_ENABLETYPE *)paramData)->bEnable; 501011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_disable_dynamic_buf_mode) { 501111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Prefer Adaptive Playback is set"); 501211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 501311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 501411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 501511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 501611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoCustomBufferSize: 501711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 501811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CUSTOM_BUFFERSIZE); 501911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoCustomBufferSize"); 502011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_CUSTOM_BUFFERSIZE* pParam = (QOMX_VIDEO_CUSTOM_BUFFERSIZE*)paramData; 502111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) { 502211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 502311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_BUFFER_SIZE_LIMIT; 502411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = pParam->nBufferSize; 502511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 502611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set input buffer size"); 502711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 502811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 502911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.ip_buf); 503011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 503111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_custom_buffersize.input_buffersize = drv_ctx.ip_buf.buffer_size; 503211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Successfully set custom input buffer size = %d", 503311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_custom_buffersize.input_buffersize); 503411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 503511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to get buffer requirement"); 503611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 503711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 503811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 503911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Custom buffer size in not supported on output port"); 504011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 504111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 504211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 504311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 504411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamVQZIPSEIType: 504511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 504611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE); 504711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVQZIPSEIType"); 504811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *pParam = 504911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *)paramData; 505011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Enable VQZIP SEI: %d", pParam->bEnable); 505111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false, 505211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 505311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 505411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to set SEI Extradata"); 505511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 505611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA; 505711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 505811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_QP_EXTRADATA, false, 505911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 506011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 506111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to set QP Extradata"); 506211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 506311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA; 506411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata = client_extradata & ~OMX_QP_EXTRADATA; 506511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 506611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 506711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 506811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 506911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 507011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamPassInputBufferFd: 507111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 507211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 507311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 507411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_QTIIndexParamPassInputBufferFd not supported in arbitrary buffer mode"); 507511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 507611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 507711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 507811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 507911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pass_buffer_fd = ((QOMX_ENABLETYPE *)paramData)->bEnable; 508011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pass_buffer_fd) 508111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Enable passing input buffer FD"); 508211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 508311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 508411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamForceCompressedForDPB: 508511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 508611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE); 508711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceCompressedForDPB"); 508811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *pParam = 508911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *)paramData; 509011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_disable_ubwc_mode) { 509111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_QTIIndexParamForceCompressedForDPB not supported when ubwc disabled"); 509211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 509311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 509411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 509511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!paramData) { 509611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceCompressedForDPB paramData NULL"); 509711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 509811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 509911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 510011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 510111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_force_compressed_for_dpb = pParam->bEnable; 510211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 510311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 510411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamForceUnCompressedForOPB: 510511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 510611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB"); 510711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *pParam = 510811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *)paramData; 510911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!paramData) { 511011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB paramData is NULL"); 511111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 511211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 511311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 511411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disable_ubwc_mode = pParam->bEnable; 511511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: UBWC %s for OPB", pParam->bEnable ? "disabled" : "enabled"); 511611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 511711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 51182601808ee2992a94c325d05e4065aba60b01840bThierry Strudel case OMX_QTIIndexParamVideoClientExtradata: 51192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel { 51202601808ee2992a94c325d05e4065aba60b01840bThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CLIENT_EXTRADATATYPE); 51212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoClientExtradata"); 51222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel QOMX_VIDEO_CLIENT_EXTRADATATYPE *pParam = 51232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (QOMX_VIDEO_CLIENT_EXTRADATATYPE *)paramData; 51242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_U32 extradata_size = VENUS_EXTRADATA_SIZE(4096, 2160); 51252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (pParam->nExtradataSize < extradata_size || 51262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel pParam->nExtradataAllocSize < (extradata_size * MAX_NUM_INPUT_OUTPUT_BUFFERS) || 51272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel pParam->nExtradataAllocSize < (pParam->nExtradataSize * MAX_NUM_INPUT_OUTPUT_BUFFERS)) { 51282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("set_parameter: Incorrect buffer size for client extradata"); 51292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel eRet = OMX_ErrorBadParameter; 51302601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 51312601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 51322601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (!m_client_extradata_info.set_extradata_info(dup(pParam->nFd), 51332601808ee2992a94c325d05e4065aba60b01840bThierry Strudel pParam->nExtradataAllocSize, pParam->nExtradataSize)) { 51342601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("set_parameter: Setting client extradata failed."); 51352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel eRet = OMX_ErrorBadParameter; 51362601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 51372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 51382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 51392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 5140af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel case OMX_QTIIndexParamDitherControl: 5141af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel { 5142af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DITHER_CONTROL); 5143af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamDitherControl"); 5144af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel QOMX_VIDEO_DITHER_CONTROL *pParam = (QOMX_VIDEO_DITHER_CONTROL *)paramData; 5145af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel DEBUG_PRINT_LOW("set_parameter: Dither Config from client is: %d", pParam->eDitherType); 5146af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel if (( pParam->eDitherType < QOMX_DITHER_DISABLE ) || 5147af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel ( pParam->eDitherType > QOMX_DITHER_ALL_COLORSPACE)) { 5148af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel DEBUG_PRINT_ERROR("set_parameter: DitherType outside the range"); 5149af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel eRet = OMX_ErrorBadParameter; 5150af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel break; 5151af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } 5152af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel m_dither_config = is_platform_tp10capture_supported() ? (dither_type)pParam->eDitherType : DITHER_ALL_COLORSPACE; 5153af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel DEBUG_PRINT_LOW("set_parameter: Final Dither Config is: %d", m_dither_config); 5154af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel break; 5155af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } 515611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: { 515711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex); 515811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 515911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 516011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 516111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) 516211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("set_parameter: Error: 0x%x, setting param 0x%x", eRet, paramIndex); 516311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 516411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 516511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 516611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 516711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 516811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::GetConfig 516911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 517011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 517111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Get Config Method implementation. 517211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 517311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 517411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 517511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 517611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 517711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if successful. 517811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 517911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 518011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp, 518111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE configIndex, 518211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_PTR configData) 518311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 518411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 518511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 518611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 518711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 518811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Config in Invalid State"); 518911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 519011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 519111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 519211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((unsigned long)configIndex) { 519311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigInterlaced: { 519411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_CONFIG_INTERLACETYPE); 519511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_CONFIG_INTERLACETYPE *configFmt = 519611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_CONFIG_INTERLACETYPE *) configData; 519711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (configFmt->nPortIndex == 1) { 519811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (configFmt->nIndex == 0) { 519911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive; 520011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (configFmt->nIndex == 1) { 520111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configFmt->eInterlaceType = 520211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 520311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (configFmt->nIndex == 2) { 520411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configFmt->eInterlaceType = 520511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 520611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 520711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:" 520811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " NoMore Interlaced formats"); 520911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 521011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 521111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 521211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 521311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port", 521411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)configFmt->nPortIndex); 521511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 521611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 521711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 521811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 521911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexQueryNumberOfVideoDecInstance: { 522011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_QUERY_DECODER_INSTANCES); 522111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances = 522211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData; 522311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel decoderinstances->nNumOfInstances = 16; 522411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 522511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 522611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 522711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigVideoFramePackingArrangement: { 522811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) { 522911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_FRAME_PACK_ARRANGEMENT); 523011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt = 523111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData; 523211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(configFmt, &m_frame_pack_arrangement, 523311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT)); 523411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 523511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs"); 523611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 523711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 523811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 523911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigCommonOutputCrop: { 524011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_RECTTYPE); 524111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData; 524211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE)); 524311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("get_config: crop info: L: %u, T: %u, R: %u, B: %u", 524411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nLeft, rectangle.nTop, 524511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nWidth, rectangle.nHeight); 524611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 524711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 524811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigPerfLevel: { 524911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL); 525011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 525111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf = 525211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData; 525311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 525411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL; 525511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) { 525611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed getting performance level: %d", errno); 525711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 525811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 525911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 526011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 526111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (control.value) { 526211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO: 526311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel perf->ePerfLevel = OMX_QCOM_PerfLevelTurbo; 526411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 526511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 526611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Unknown perf level %d, reporting Nominal instead", control.value); 526711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Fall through */ 526811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL: 526911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel perf->ePerfLevel = OMX_QCOM_PerfLevelNominal; 527011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 527111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 527211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 527311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 527411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 527511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 527611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigH264EntropyCodingCabac: { 527711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_H264ENTROPYCODINGTYPE); 527811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_H264ENTROPYCODINGTYPE *coding = (QOMX_VIDEO_H264ENTROPYCODINGTYPE *)configData; 527911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 528011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 528111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.decoder_format != VDEC_CODECTYPE_H264) { 528211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_config of OMX_QcomIndexConfigH264EntropyCodingCabac only available for H264"); 528311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNotImplemented; 528411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 528511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 528611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 528711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE; 528811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control)) { 528911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel coding->bCabac = (OMX_BOOL) 529011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (control.value == V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC); 529111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* We can't query driver at the moment for the cabac mode, so 529211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * just use 0xff...f as a place holder for future improvement */ 529311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel coding->nCabacInitIdc = ~0; 529411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 529511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 529611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 529711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 529811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 529911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 5300fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case OMX_QTIIndexConfigDescribeColorAspects: 5301fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 5302fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams); 5303fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData; 5304fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 5305fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(m_client_color_space.sAspects), "GetConfig Client"); 5306fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(m_internal_color_space.sAspects), "GetConfig Internal"); 5307fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 5308fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (params->bRequestingDataSpace) { 5309fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Does not handle dataspace request"); 5310fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 5311fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 5312fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_internal_color_space.bDataSpaceChanged == OMX_TRUE) { 5313fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Updating Client's color aspects with internal"); 5314fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(&(m_client_color_space.sAspects), 5315fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel &(m_internal_color_space.sAspects), sizeof(ColorAspects)); 5316fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.bDataSpaceChanged = OMX_FALSE; 5317fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 5318fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(&(params->sAspects), &(m_client_color_space.sAspects), sizeof(ColorAspects)); 5319fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 5320fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 5321fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 5322fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel case OMX_QTIIndexConfigDescribeHDRColorInfo: 5323fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel { 5324fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel VALIDATE_OMX_PARAM_DATA(configData, DescribeHDRStaticInfoParams); 5325fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DescribeHDRStaticInfoParams *params = (DescribeHDRStaticInfoParams *)configData; 5326fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel auto_lock lock(m_hdr_info_client_lock); 5327fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 5328fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel print_debug_hdr_color_info(&(m_client_hdr_info.sInfo), "GetConfig Client HDR"); 5329fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel print_debug_hdr_color_info(&(m_internal_hdr_info.sInfo), "GetConfig Internal HDR"); 5330fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 5331fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (m_change_client_hdr_info) { 5332fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("Updating Client's HDR Info with internal"); 5333fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel memcpy(&m_client_hdr_info.sInfo, 5334fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel &m_internal_hdr_info.sInfo, sizeof(HDRStaticInfo)); 5335fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_change_client_hdr_info = false; 5336fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 5337fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 5338fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel memcpy(&(params->sInfo), &(m_client_hdr_info.sInfo), sizeof(HDRStaticInfo)); 5339fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 5340fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel break; 5341fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 5342fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel default: 5343fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel { 5344fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex); 5345fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel eRet = OMX_ErrorBadParameter; 5346fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 534711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 534811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 534911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 535011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 535111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 535211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 535311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 535411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 535511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::SetConfig 535611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 535711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 535811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Set Config method implementation 535911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 536111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 536211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 536411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if successful. 536511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 536611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp, 536711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE configIndex, 536811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR configData) 536911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 537011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 537111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 537211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Config in Invalid State"); 537311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 537411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 537511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 537611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 537711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_CONFIG_NALSIZE *pNal; 537811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 537911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set Config Called"); 538011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 538111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (configIndex == OMX_IndexConfigVideoNalSize) { 538211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control temp; 538311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT; 538411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 538511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_NALSIZE); 538611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData); 538711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (pNal->nNaluBytes) { 538811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case 0: 538911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES; 539011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 539111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case 2: 539211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_TWO_BYTE_LENGTH; 539311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 539411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case 4: 539511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH; 539611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 539711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 539811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 539911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 540011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 540111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!arbitrary_bytes) { 540211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* In arbitrary bytes mode, the assembler strips out nal size and replaces 540311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * with start code, so only need to notify driver in frame by frame mode */ 540411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &temp)) { 540511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT"); 540611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 540711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 540811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 540911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 541011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_length = pNal->nNaluBytes; 541111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_nal_length(nal_length); 541211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 541311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d", nal_length); 541411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 541511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((int)configIndex == (int)OMX_IndexVendorVideoFrameRate) { 541611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData; 541711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Index OMX_IndexVendorVideoFrameRate %u", (unsigned int)config->nFps); 541811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 541911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) { 542011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (config->bEnabled) { 5421fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if ((config->nFps >> 16) > 0 && 5422fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (config->nFps >> 16) <= MAX_SUPPORTED_FPS) { 5423fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_fps_received = config->nFps; 542411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %u", 542511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)config->nFps >> 16); 542611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator, 542711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator); 542811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 542911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.frame_rate.fps_numerator) { 543011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 543111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = 30; 543211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 543311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 543411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.frame_rate.fps_denominator) { 543511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = (int) 543611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 543711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 543811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 543911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator = 1; 544011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 544111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator; 544211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 544311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_outputparm oparm; 544411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*XXX: we're providing timing info as seconds per frame rather than frames 544511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * per second.*/ 544611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 544711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 544811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 544911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_streamparm sparm; 545011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 545111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.parm.output = oparm; 545211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) { 545311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \ 545411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel performance might be affected"); 545511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorHardware; 545611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 545711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_set_fps = true; 545811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 545911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Frame rate not supported."); 546011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorUnsupportedSetting; 546111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 546211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 546311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate"); 546411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_set_fps = false; 546511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 546611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 546711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d", 546811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)config->nPortIndex); 546911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorBadPortIndex; 547011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 547111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 547211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 547311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((int)configIndex == (int)OMX_QcomIndexConfigPerfLevel) { 547411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf = 547511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData; 547611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 547711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 547811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set perf level: %d", perf->ePerfLevel); 547911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 548011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL; 548111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 548211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (perf->ePerfLevel) { 548311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_PerfLevelNominal: 548411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL; 548511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 548611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_PerfLevelTurbo: 548711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO; 548811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 548911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 549011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorUnsupportedSetting; 549111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 549211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 549311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 549411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret == OMX_ErrorNone) { 549511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ? 549611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorUnsupportedSetting : OMX_ErrorNone; 549711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 549811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 549911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 550011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((int)configIndex == (int)OMX_QcomIndexConfigPictureTypeDecode) { 550111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *config = 550211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *)configData; 550311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 550411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set picture type decode: %d", config->eDecodeType); 550511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_PICTYPE_DEC_MODE; 550611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 550711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (config->eDecodeType) { 550811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_PictypeDecode_I: 550911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_ON; 551011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 551111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_PictypeDecode_IPB: 551211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 551311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_OFF; 551411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 551511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 551611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 551711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ? 551811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorUnsupportedSetting : OMX_ErrorNone; 551911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) 552011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set picture type decode"); 552111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 552211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 552311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((int)configIndex == (int)OMX_IndexConfigPriority) { 552411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_U32TYPE *priority = (OMX_PARAM_U32TYPE *)configData; 552511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set_config: priority %d",priority->nU32); 552611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 552711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 552811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 552911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY; 553011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (priority->nU32 == 0) 553111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE; 553211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 553311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE; 553411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 553511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 553611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set Priority"); 553711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorUnsupportedSetting; 553811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 553911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 554011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((int)configIndex == (int)OMX_IndexConfigOperatingRate) { 554111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_U32TYPE *rate = (OMX_PARAM_U32TYPE *)configData; 554211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set_config: operating-rate %u fps", rate->nU32 >> 16); 554311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 554411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 554511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 554611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE; 554711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = rate->nU32; 554811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 554911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel operating_frame_rate = rate->nU32 >> 16; 555011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 555111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 555211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = errno == -EBUSY ? OMX_ErrorInsufficientResources : 555311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorUnsupportedSetting; 555411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set operating rate %u fps (%s)", 555511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rate->nU32 >> 16, errno == -EBUSY ? "HW Overload" : strerror(errno)); 555611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 555711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 5558fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 5559fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeColorAspects) { 5560fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams); 5561fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData; 5562fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!DEFAULT_EXTRADATA & OMX_DISPLAY_INFO_EXTRADATA) { 5563fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel enable_extradata(OMX_DISPLAY_INFO_EXTRADATA, true, true); 5564fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 5565fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 5566fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(params->sAspects), "Set Config"); 5567fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(&m_client_color_space, params, sizeof(DescribeColorAspectsParams)); 5568fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return ret; 5569fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeHDRColorInfo) { 5570fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel VALIDATE_OMX_PARAM_DATA(configData, DescribeHDRStaticInfoParams); 5571fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DescribeHDRStaticInfoParams *params = (DescribeHDRStaticInfoParams *)configData; 5572fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (!DEFAULT_EXTRADATA & OMX_HDR_COLOR_INFO_EXTRADATA) { 5573fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel ret = enable_extradata(OMX_HDR_COLOR_INFO_EXTRADATA, true, true); 5574fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (ret != OMX_ErrorNone) { 5575fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_ERROR("Failed to enable OMX_HDR_COLOR_INFO_EXTRADATA"); 5576fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return ret; 5577fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 5578fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 5579fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 5580fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel print_debug_hdr_color_info(&(params->sInfo), "Set Config HDR"); 5581fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel memcpy(&m_client_hdr_info, params, sizeof(DescribeHDRStaticInfoParams)); 5582fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return ret; 558311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 558411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 558511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 558611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 558711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5588fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define extn_equals(param, extn) (!strcmp(param, extn)) 558911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 559011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 559111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 559211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::GetExtensionIndex 559311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 559411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 559511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX GetExtensionIndex method implementaion. <TBD> 559611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 559711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 559811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 559911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 560011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 560111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 560211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 560311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 560411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp, 560511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_STRING paramName, 560611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_INDEXTYPE* indexType) 560711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 560811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 560911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 561011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Extension Index in Invalid State"); 561111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 561211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode")) { 561311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode; 561411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.QCOM.index.param.IndexExtraData")) { 561511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType; 561611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_FRAMEPACKING_EXTRADATA)) { 561711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoFramePackingExtradata; 561811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, OMX_QCOM_INDEX_CONFIG_VIDEO_FRAMEPACKING_INFO)) { 561911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement; 562011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_QP_EXTRADATA)) { 562111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPExtraData; 562211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_INPUTBITSINFO_EXTRADATA)) { 562311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoInputBitsInfoExtraData; 562411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_EXTNUSER_EXTRADATA)) { 562511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexEnableExtnUserData; 562611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 562711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 562811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (extn_equals(paramName, "OMX.google.android.index.enableAndroidNativeBuffers")) { 562911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 563011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer2")) { 563111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 563211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer")) { 563311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extension: %s is supported", paramName); 563411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 563511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.google.android.index.getAndroidNativeBufferUsage")) { 563611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 563711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 563811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if ALLOCATE_OUTPUT_NATIVEHANDLE 563911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (extn_equals(paramName, "OMX.google.android.index.allocateNativeHandle")) { 564011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexAllocateNativeHandle; 564111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 564211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //ALLOCATE_OUTPUT_NATIVEHANDLE 564311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 564411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (extn_equals(paramName, "OMX.google.android.index.storeMetaDataInBuffers")) { 564511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoMetaBufferMode; 564611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 564711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED 564811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (extn_equals(paramName, "OMX.google.android.index.prepareForAdaptivePlayback")) { 564911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoAdaptivePlaybackMode; 565011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_PREFER_ADAPTIVE_PLAYBACK)) { 565111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoPreferAdaptivePlayback; 565211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 565311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 565411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FLEXYUV_SUPPORTED 565511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (extn_equals(paramName,"OMX.google.android.index.describeColorFormat")) { 565611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexFlexibleYUVDescription; 565711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 565811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 565911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (extn_equals(paramName, "OMX.QCOM.index.param.video.PassInputBufferFd")) { 566011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamPassInputBufferFd; 566111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceCompressedForDPB")) { 566211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceCompressedForDPB; 566311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceUnCompressedForOPB")) { 566411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceUnCompressedForOPB; 566511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.QTI.index.param.video.LowLatency")) { 566611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamLowLatencyMode; 56672601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_CLIENT_EXTRADATA)) { 56682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoClientExtradata; 5669fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (extn_equals(paramName, "OMX.google.android.index.describeColorAspects")) { 5670fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeColorAspects; 5671fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } else if (extn_equals(paramName, "OMX.google.android.index.describeHDRStaticInfo")) { 5672fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeHDRColorInfo; 567311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 567411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName); 567511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 567611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 567711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 567811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 567911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 568011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 568111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 568211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::GetState 568311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 568411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 568511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns the state information back to the caller.<TBD> 568611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 568711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 568811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 568911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 569011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 569111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Error None if everything is successful. 569211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 569311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_state(OMX_IN OMX_HANDLETYPE hComp, 569411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_STATETYPE* state) 569511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 569611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 569711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *state = m_state; 569811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_state: Returning the state %d",*state); 569911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 570011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 570111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 570211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 570311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 570411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ComponentTunnelRequest 570511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 570611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 570711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Component Tunnel Request method implementation. <TBD> 570811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 570911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 571011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 571111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 571211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 571311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 571411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 571511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 571611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp, 571711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 571811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE peerComponent, 571911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 peerPort, 572011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup) 572111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 572211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 572311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) port; 572411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) peerComponent; 572511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) peerPort; 572611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) tunnelSetup; 572711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented"); 572811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 572911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 573011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 573111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 573211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 573311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::UseOutputBuffer 573411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 573511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 573611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Helper function for Use buffer in the input pin 573711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 573811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 573911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 574011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 574111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 574211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 574311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 574411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 574511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_extradata() 574611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 574711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 574811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.extradata_info.buffer_size) { 574911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) { 575011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 575111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 575211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.extradata_info.ion); 575311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 575411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095); 575511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory( 575611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.size, 4096, 575711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.extradata_info.ion.ion_alloc_data, 575811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.extradata_info.ion.fd_ion_data, 0); 575911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.extradata_info.ion.ion_device_fd < 0) { 576011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc extradata memory"); 576111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 576211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 576311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.uaddr = (char *)mmap(NULL, 576411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.size, 576511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, 576611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.ion.fd_ion_data.fd , 0); 576711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.extradata_info.uaddr == MAP_FAILED) { 576811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to map extradata memory"); 576911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 577011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.extradata_info.ion); 577111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 577211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 577311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 577411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 577511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_other_extradata) { 577611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_other_extradata = (OMX_OTHER_EXTRADATATYPE *)malloc(drv_ctx.extradata_info.buffer_size); 577711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_other_extradata) { 577811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc memory\n"); 577911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 578011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 578111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 578211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 578311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 578411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 578511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_extradata() 578611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 578711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 578811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.extradata_info.uaddr) { 578911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 579011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 579111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.extradata_info.ion); 579211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 579311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 579411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_other_extradata) { 579511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_other_extradata); 579611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_other_extradata = NULL; 579711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 579811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 579911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 580011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_output_buffer( 580111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 580211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 580311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 580411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 580511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 580611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 580711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 580811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 580911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 581011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i= 0; // Temporary counter 581111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_setbuffer_cmd setbuffers; 581211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR privateAppData = NULL; 581311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = NULL; 581411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *buff = buffer; 581511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 581611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 581711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 581811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 581911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) port; 582011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 582111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_out_mem_ptr) { 582211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers"); 582311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_output_headers(); 582411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) 582511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_extradata(); 582611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 582711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 582811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 582911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 583011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_out_bm_count,i)) { 583111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 583211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 583311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 583411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 583511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 583611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i >= drv_ctx.op_buf.actualcount) { 583711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount); 583811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 583911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 584011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 584111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) 584211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 584311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 584411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dynamic_buf_mode) { 584511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_out_mem_ptr + i ); 584611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = NULL; 584711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i == (drv_ctx.op_buf.actualcount - 1) && !streaming[CAPTURE_PORT]) { 584811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 584911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rr = 0; 585011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 585111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rr = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON, &buf_type)) { 585211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("STREAMON FAILED : %d", rr); 585311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 585411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 585511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = true; 585611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("STREAMON Successful"); 585711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 585811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 585911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enabling Turbo mode"); 586011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel request_perf_level(VIDC_TURBO); 586111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 586211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_out_bm_count,i); 586311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pAppPrivate = appData; 586411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = buffer; 586511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nAllocLen = sizeof(struct VideoDecoderOutputMetaData); 586611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 586711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 586811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 586911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 587011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 587111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 587211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_use_android_native_buffers) { 587311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 587411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sp<android_native_buffer_t> nBuf = params->nativeBuffer; 587511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)nBuf->handle; 587611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = params->pAppPrivate; 587711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 587811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)buff; 587911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = appData; 588011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 588111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!handle) { 588211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("handle is invalid"); 588311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 588411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 588511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 588611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) { 588711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode && secure_scaling_to_non_secure_opb) { 588811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Buffer size expected %u, got %u, but it's ok since we will never map it", 588911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size); 589011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 589111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 589211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " expected %u, got %u", 589311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size); 589411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 589511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 589611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 589711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 589811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size = handle->size; 589911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 590011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_use_android_native_buffers) { 590111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 590211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buff = (OMX_U8*)mmap(0, handle->size, 590311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 590411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buff == MAP_FAILED) { 590511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 590611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 590711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 590811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 590911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 591011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_ICS_) 591111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[i].nativehandle = handle; 591211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[i].privatehandle = handle; 591311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 591411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!handle) { 591511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 591611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 591711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 591811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd; 591911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].offset = 0; 592011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 592111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 592211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size; 592311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 592411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 592511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 592611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ouput_egl_buffers && !m_use_output_pmem) { 592711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 592811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 592911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment, 593011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.op_buf_ion_info[i].ion_alloc_data, 593111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.op_buf_ion_info[i].fd_ion_data, 593211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode ? SECURE_FLAGS_OUTPUT_BUFFER : 0); 593311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) { 593411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd); 593511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 593611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 593711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 593811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 593911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 594011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 594111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel open (MEM_DEVICE,O_RDWR); 594211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 594311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 594411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd); 594511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 594611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 594711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 594811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */ 594911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) { 595011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 595111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel open (MEM_DEVICE,O_RDWR); 595211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 595311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd); 595411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 595511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 595611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 595711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 595811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd, 595911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size, 596011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.alignment)) { 596111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 596211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 596311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 596411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 596511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 596611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 596711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = 596811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size, 596911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, 597011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd,0); 597111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) { 597211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 597311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 597411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 597511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 597611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unable to mmap output buffer"); 597711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 597811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 597911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 598011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].offset = 0; 598111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = appData; 598211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 598311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 598411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem); 598511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!appData || !bytes ) { 598611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && !buffer) { 598711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case"); 598811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 598911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 599011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 599111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 599211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list; 599311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info; 599411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData; 599511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pmem_list || !pmem_list->entryList || !pmem_list->entryList->entry || 599611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !pmem_list->nEntries || 599711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 599811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Pmem info not valid in use buffer"); 599911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 600011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 600111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 600211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list->entryList->entry; 600311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx", 600411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_info->pmem_fd); 600511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd; 600611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset; 600711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 600811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].mmaped_size = 600911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 601011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = appData; 601111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 601211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 601311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd; 601411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len; 601511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size; 601611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr; 601711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 601811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_out_mem_ptr + i ); 601911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode) 602011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 602111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 602211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i], 602311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof (vdec_bufferpayload)); 602411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 602511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i, 602611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr, 602711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd ); 602811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 602911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = i; 603011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 603111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 603211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = drv_ctx.op_buf.buffer_size; 603311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 603411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 603511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd; 603611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 603711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = 0; 603811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 603911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 604011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 604111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 604211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 604311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 604411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 604511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 604611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].data_offset = 0; 604711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 604811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 604911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 605011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 605111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = plane; 605211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = drv_ctx.num_planes; 605311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 605411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) { 605511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to prepare bufs"); 605611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 605711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 605811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 605911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 606011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) { 606111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 606211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 606311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) { 606411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 606511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 606611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = true; 606711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("STREAMON Successful"); 606811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 606911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 607011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enabling Turbo mode"); 607111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel request_perf_level(VIDC_TURBO); 607211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 607311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 607411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size; 607511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 607611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle); 607711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = (OMX_U8 *)handle; 607811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 607911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = buff; 608011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 608111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pAppPrivate = privateAppData; 608211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_out_bm_count,i); 608311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 608411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 608511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 608611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 608711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 608811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 608911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::use_input_heap_buffers 609011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 609111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 609211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Use Buffer Heap allocation method implementation. 609311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 609411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 609511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 609611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 609711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 609811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None , if everything successful. 609911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 610011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 610111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_input_heap_buffers( 610211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 610311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 610411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 610511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 610611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 610711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 610811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 610911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer); 611011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 61117b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan 61127b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan if (secure_mode) { 61137b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan DEBUG_PRINT_ERROR("use_input_heap_buffers is not allowed in secure mode"); 61147b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan return OMX_ErrorUndefined; 61157b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan } 61167b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan 611711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_inp_heap_ptr) 611811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 611911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 612011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 612111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_phdr_pmem_ptr) 612211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 612311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 612411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 612511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) { 612611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Insufficent memory"); 612711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 612811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) { 612911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer = true; 613011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 613111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 613211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 613311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 613411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 613511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 613611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 613711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes); 613811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]); 613911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[m_in_alloc_cnt], 614011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL, (unsigned)NULL)) { 614111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 614211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 614311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 614411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_in_alloc_cnt++; 614511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 614611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("All i/p buffers have been set!"); 614711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 614811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 614911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 615011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 615111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 615211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 615311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 615411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::UseBuffer 615511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 615611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 615711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Use Buffer method implementation. 615811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 615911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 616011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 616111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 616211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 616311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None , if everything successful. 616411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 616511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 616611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_buffer( 616711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 616811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 616911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 617011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 617111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 617211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 617311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 617411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE error = OMX_ErrorNone; 617511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_setbuffer_cmd setbuffers; 617611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 617711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL || bytes == 0 || (!secure_mode && buffer == NULL)) { 617811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("bad param 0x%p %u 0x%p",bufferHdr, (unsigned int)bytes, buffer); 617911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 618011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 618111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 618211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Use Buffer in Invalid State"); 618311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 618411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 6185fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX) { 6186fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // If this is not the first allocation (i.e m_inp_mem_ptr is allocated), 6187fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // ensure that use-buffer was called for previous allocation. 6188fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Mix-and-match of useBuffer and allocateBuffer is not allowed 6189fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_inp_mem_ptr && !input_use_buffer) { 6190fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("'Use' Input buffer called after 'Allocate' Input buffer !"); 6191fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUndefined; 6192fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 619311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer); 6194fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) 619511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested 619611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 619711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port); 619811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel error = OMX_ErrorBadPortIndex; 619911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 620011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", (unsigned int)port, *bufferHdr, error); 620111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (error == OMX_ErrorNone) { 620211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 620311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 620411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 620511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandStateSet,OMX_StateIdle, 620611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 620711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 620811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated && 620911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 621011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 621111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 621211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX, 621311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 621411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated && 621511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 621611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 621711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 621811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, 621911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 622011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 622111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 622211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return error; 622311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 622411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 622511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex, 622611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *pmem_bufferHdr) 622711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 622811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) { 622911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_heap_ptr[bufferindex].pBuffer) 623011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_inp_heap_ptr[bufferindex].pBuffer); 623111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[bufferindex].pBuffer = NULL; 623211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 623311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_bufferHdr) 623411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer(pmem_bufferHdr); 623511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 623611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 623711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 623811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 623911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 624011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = 0; 624111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL || m_inp_mem_ptr == NULL) { 624211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 624311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 624411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 624511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufferHdr - m_inp_mem_ptr; 624611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); 624711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 624811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel auto_lock l(buf_lock); 624911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferHdr->pInputPortPrivate = NULL; 625011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 625111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) { 625211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); 625311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_inputbuffer[index].pmem_fd >= 0) { 625411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_setbuffer_cmd setbuffers; 625511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT; 625611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index], 625711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof (vdec_bufferpayload)); 625811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 625911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("unmap the input buffer fd=%d", 626011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].pmem_fd); 626111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("unmap the input buffer size=%u address = %p", 626211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.ptr_inputbuffer[index].mmaped_size, 626311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].bufferaddr); 626411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr, 626511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].mmaped_size); 6266d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel } 6267d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel 6268d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel if (allocate_native_handle){ 626911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_handle_t *nh = (native_handle_t *)bufferHdr->pBuffer; 627011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_handle_close(nh); 627111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_handle_delete(nh); 6272d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel } else { 6273d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel // Close fd for non-secure and secure non-native-handle case 6274d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel close(drv_ctx.ptr_inputbuffer[index].pmem_fd); 627511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 627611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].pmem_fd = -1; 6277d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel 627811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) { 627911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_desc_buffer_ptr[index].buf_addr); 628011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_desc_buffer_ptr[index].buf_addr = NULL; 628111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_desc_buffer_ptr[index].desc_data_size = 0; 628211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 628311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 628411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.ip_buf_ion_info[index]); 628511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 628611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 628711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 628811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 628911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 629011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 629111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 629211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 629311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 629411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = 0; 629511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 629611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL || m_out_mem_ptr == NULL) { 629711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 629811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 629911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 630011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufferHdr - m_out_mem_ptr; 630111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index); 630211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 630311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < drv_ctx.op_buf.actualcount 630411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && drv_ctx.ptr_outputbuffer) { 630511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %p", index, 630611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].bufferaddr); 630711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 630811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_setbuffer_cmd setbuffers; 630911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 631011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index], 631111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof (vdec_bufferpayload)); 631211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 631311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dynamic_buf_mode) { 631411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (streaming[CAPTURE_PORT] && 631511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !(in_reconfig || BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING))) { 631611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) { 631711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("STREAMOFF Failed"); 631811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 631911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("STREAMOFF Successful"); 632011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 632111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 632211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 632311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 632411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 632511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) { 632611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr, 632711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].mmaped_size); 632811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 632911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 633011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 633111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 633211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 633311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) { 633411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 633511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("unmap the output buffer fd = %d", 633611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[0].pmem_fd); 633711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("unmap the ouput buffer size=%u address = %p", 633811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount, 633911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[0].bufferaddr); 634011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr, 634111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount); 634211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 634311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close (drv_ctx.ptr_outputbuffer[0].pmem_fd); 634411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[0].pmem_fd = -1; 634511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 634611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.op_buf_ion_info[0]); 634711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 634811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 634911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 635011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 635111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 635211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } //!dynamic_buf_mode 635311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_output_done()) { 635411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_extradata(); 635511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 635611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 635711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 635811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 635911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 636011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 636111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 636211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 636311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE **bufferHdr, 636411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 port, 636511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR appData, 636611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 bytes) 636711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 636811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *input = NULL; 636911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *buf_addr = NULL; 637011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 637111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 637211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 637311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Sanity Check*/ 637411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL) { 637511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 637611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 637711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 637811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_heap_ptr == NULL) { 637911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \ 638011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 638111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 638211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \ 638311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 638411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 638511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 638611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_heap_ptr == NULL || m_phdr_pmem_ptr == NULL) { 638711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("m_inp_heap_ptr or m_phdr_pmem_ptr Allocation failed "); 638811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 638911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 639011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 639111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 639211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Find a Free index*/ 639311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 639411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) { 639511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Input Buffer Index %d",i); 639611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 639711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 639811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 639911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 640011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < drv_ctx.ip_buf.actualcount) { 640111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size); 640211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 640311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_addr == NULL) { 640411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 640511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 640611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 640711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_inp_heap_ptr + i); 640811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input = *bufferHdr; 640911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_heap_inp_bm_count,i); 641011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 641111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pBuffer = (OMX_U8 *)buf_addr; 641211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 641311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nVersion.nVersion = OMX_SPEC_VERSION; 641411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nAllocLen = drv_ctx.ip_buf.buffer_size; 641511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pAppPrivate = appData; 641611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 641711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr ); 641811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes); 641911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]); 642011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Add the Buffers to freeq*/ 642111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[i], 642211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL, (unsigned)NULL)) { 642311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 642411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 642511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 642611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 642711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 642811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 642911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 643011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 643111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 643211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 643311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 643411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 643511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 643611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 643711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::AllocateInputBuffer 643811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 643911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 644011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Helper function for allocate buffer in the input pin 644111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 644211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 644311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 644411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 644511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 644611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 644711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 644811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 644911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_input_buffer( 645011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 645111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 645211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 645311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 645411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes) 645511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 645611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 645711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_setbuffer_cmd setbuffers; 645811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *input = NULL; 645911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 646011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *buf_addr = NULL; 646111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pmem_fd = -1; 646211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 646311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 646411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) port; 646511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 646611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 646711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bytes != drv_ctx.ip_buf.buffer_size) { 646811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Requested Size is wrong %u epected is %u", 646911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)bytes, (unsigned int)drv_ctx.ip_buf.buffer_size); 647011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 647111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 647211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 647311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_inp_mem_ptr) { 647411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%u)", 647511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount, 647611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.ip_buf.buffer_size); 647711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 647811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 647911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 648011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 648111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr == NULL) { 648211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 648311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 648411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 648511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \ 648611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount); 648711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 648811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_inputbuffer == NULL) { 648911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 649011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 649111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 649211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \ 649311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount); 649411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 649511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ip_buf_ion_info == NULL) { 649611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 649711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 649811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 649911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 650011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i < drv_ctx.ip_buf.actualcount; i++) { 650111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].pmem_fd = -1; 650211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 650311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1; 650411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 650511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 650611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 650711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 650811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 650911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 651011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Input Buffer Index %d",i); 651111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 651211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 651311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 651411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 651511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < drv_ctx.ip_buf.actualcount) { 651611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 651711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane; 651811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 651911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocate input Buffer"); 652011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 652111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 652211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment, 652311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.ip_buf_ion_info[i].ion_alloc_data, 652411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? 652511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SECURE_FLAGS_INPUT_BUFFER : ION_FLAG_CACHED); 652611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) { 652711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 652811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 652911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd; 653011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 653111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = open (MEM_DEVICE,O_RDWR); 653211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 653311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_fd < 0) { 653411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer"); 653511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 653611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 653711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 653811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_fd == 0) { 653911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = open (MEM_DEVICE,O_RDWR); 654011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 654111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_fd < 0) { 654211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer"); 654311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 654411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 654511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 654611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 654711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size, 654811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.alignment)) { 654911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 655011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd); 655111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 655211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 655311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 655411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 655511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_addr = (unsigned char *)mmap(NULL, 655611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size, 655711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0); 655811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 655911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_addr == MAP_FAILED) { 656011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd); 656111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 656211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.ip_buf_ion_info[i]); 656311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 656411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Map Failed to allocate input buffer"); 656511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 656611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 656711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 656811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_inp_mem_ptr + i); 656911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode) 657011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr; 657111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 657211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr; 657311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd; 657411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 657511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size; 657611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].offset = 0; 657711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 657811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 657911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = i; 658011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 658111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 658211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.bytesused = 0; 658311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size; 658411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr; 658511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd; 658611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.reserved[1] = 0; 658711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset; 658811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = &plane; 658911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = 1; 659011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 659111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %p", i, 659211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[i].bufferaddr); 659311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 659411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 659511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 659611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 659711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to prepare bufs"); 659811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 659911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 660011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 660111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 660211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input = *bufferHdr; 660311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_inp_bm_count,i); 660411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr); 660511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocate_native_handle) { 660611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_handle_t *nh = native_handle_create(1 /*numFds*/, 0 /*numInts*/); 660711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!nh) { 660811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Native handle create failed"); 660911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 661011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 661111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nh->data[0] = drv_ctx.ptr_inputbuffer[i].pmem_fd; 661211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pBuffer = (OMX_U8 *)nh; 661311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (secure_mode || m_input_pass_buffer_fd) { 661411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Legacy method, pass ion fd stashed directly in pBuffer*/ 661511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pBuffer = (OMX_U8 *)(intptr_t)drv_ctx.ptr_inputbuffer[i].pmem_fd; 661611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 661711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pBuffer = (OMX_U8 *)buf_addr; 661811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 661911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 662011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nVersion.nVersion = OMX_SPEC_VERSION; 662111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nAllocLen = drv_ctx.ip_buf.buffer_size; 662211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pAppPrivate = appData; 662311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 662411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; 662511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 662611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.disable_dmx) { 662711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_desc_buffer(i); 662811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 662911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 663011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found"); 663111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 663211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 663311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 663411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 663511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 663611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 663711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 663811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 663911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::AllocateOutputBuffer 664011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 664111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 664211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Helper fn for AllocateBuffer in the output pin 664311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 664411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 664511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 664611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 664711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 664811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything went well. 664911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 665011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 665111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_output_buffer( 665211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 665311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 665411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 665511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 665611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes) 665711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 665811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 665911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)port; 666011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 666111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 666211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i= 0; // Temporary counter 666311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_setbuffer_cmd setbuffers; 666411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 666511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 666611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ion_device_fd =-1; 666711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_allocation_data ion_alloc_data; 666811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_fd_data fd_ion_data; 666911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 667011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_out_mem_ptr) { 667111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%u)", 667211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount, 667311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.op_buf.buffer_size); 667411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nBufHdrSize = 0; 667511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPlatformEntrySize = 0; 667611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPlatformListSize = 0; 667711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPMEMInfoSize = 0; 667811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pmem_fd = -1; 667911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *pmem_baseaddress = NULL; 668011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 668111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 668211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 668311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 668411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 668511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)", 668611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 668711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufHdrSize = drv_ctx.op_buf.actualcount * 668811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_BUFFERHEADERTYPE); 668911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 669011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPMEMInfoSize = drv_ctx.op_buf.actualcount * 669111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 669211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPlatformListSize = drv_ctx.op_buf.actualcount * 669311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 669411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPlatformEntrySize = drv_ctx.op_buf.actualcount * 669511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 669611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 669711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize, 669811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)sizeof(OMX_BUFFERHEADERTYPE), 669911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPMEMInfoSize, 670011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPlatformListSize); 670111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize, 670211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 670311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 670411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Allocate output buffers as cached to improve performance of software-reading 670511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // of the YUVs. Output buffers are cache-invalidated in driver. 670611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // If color-conversion is involved, Only the C2D output buffers are cached, no 670711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // need to cache the decoder's output buffers 670811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int cache_flag = client_buffers.is_color_conversion_enabled() ? 0 : ION_FLAG_CACHED; 670911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_device_fd = alloc_map_ion_memory( 671011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount, 671111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_scaling_to_non_secure_opb ? SZ_4K : drv_ctx.op_buf.alignment, 671211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &ion_alloc_data, &fd_ion_data, 671311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (secure_mode && !secure_scaling_to_non_secure_opb) ? 671411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SECURE_FLAGS_OUTPUT_BUFFER : cache_flag); 671511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ion_device_fd < 0) { 671611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 671711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 671811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = fd_ion_data.fd; 671911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 672011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = open (MEM_DEVICE,O_RDWR); 672111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 672211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_fd < 0) { 672311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d", 672411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size); 672511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 672611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 672711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 672811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size * 672911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount, 673011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.alignment)) { 673111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 673211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd); 673311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 673411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 673511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 673611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 673711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_baseaddress = (unsigned char *)mmap(NULL, 673811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.op_buf.buffer_size * 673911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount), 674011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0); 674111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_baseaddress == MAP_FAILED) { 674211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("MMAP failed for Size %u", 674311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.op_buf.buffer_size); 674411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd); 674511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 674611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 674711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 674811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 674911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 675011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 675111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 675211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Alloc mem for platform specific info 675311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char *pPtr=NULL; 675411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 675511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPMEMInfoSize,1); 675611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\ 675711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct vdec_bufferpayload), 675811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 675911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 676011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof (struct vdec_output_frameinfo), 676111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 676211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) { 676311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer "); 676411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 676511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 676611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 676711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 676811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = (struct vdec_ion *)\ 676911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct vdec_ion), 677011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 677111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.op_buf_ion_info) { 677211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info"); 677311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 677411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 677511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 677611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 677711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 677811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && drv_ctx.ptr_respbuffer) { 677911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[0].mmaped_size = 678011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.op_buf.buffer_size * 678111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 678211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr = m_out_mem_ptr; 678311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 678411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 678511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((char *) m_platform_list) + nPlatformListSize); 678611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 678711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((char *) m_platform_entry) + nPlatformEntrySize); 678811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList = m_platform_list; 678911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry = m_platform_entry; 679011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo = m_pmem_info; 679111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 679211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 679311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 679411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Settting the entire storage nicely 679511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry); 679611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo); 679711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 679811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 679911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 680011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Set the values when we determine the right HxW param 680111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nAllocLen = bytes; 680211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nFilledLen = 0; 680311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pAppPrivate = appData; 680411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 680511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Platform specific PMEM Information 680611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Initialize the Platform Entry 680711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i); 680811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 680911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry->entry = pPMEMInfo; 681011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Initialize the Platform List 681111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList->nEntries = 1; 681211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList->entryList = pPlatformEntry; 681311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Keep pBuffer NULL till vdec is opened 681411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pBuffer = NULL; 681511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nOffset = 0; 681611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 681711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo->offset = drv_ctx.op_buf.buffer_size*i; 681811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo->pmem_fd = -1; 681911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pPlatformPrivate = pPlatformList; 682011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 682111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd; 682211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].pmem_fd = pmem_fd; 682311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 682411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd; 682511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data; 682611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data; 682711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 682811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 682911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Create a mapping between buffers*/ 683011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 683111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer[i].client_data = (void *)\ 683211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.ptr_outputbuffer[i]; 683311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i; 683411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = 683511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i); 683611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len; 683711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size; 683811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr; 683911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 684011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("pmem_fd = %d offset = %u address = %p", 684111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd, (unsigned int)drv_ctx.ptr_outputbuffer[i].offset, 684211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr); 684311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Move the buffer and buffer header pointers 684411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr++; 684511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo++; 684611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry++; 684711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList++; 684811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 684911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 685011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\ 685111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr, pPtr); 685211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 685311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_out_mem_ptr); 685411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = NULL; 685511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 685611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pPtr) { 685711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(pPtr); 685811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPtr = NULL; 685911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 686011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer) { 686111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ptr_outputbuffer); 686211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = NULL; 686311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 686411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_respbuffer) { 686511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ptr_respbuffer); 686611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = NULL; 686711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 686811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 686911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.op_buf_ion_info) { 687011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free o/p ion context"); 687111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.op_buf_ion_info); 687211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = NULL; 687311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 687411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 687511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 687611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 687711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) 687811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_extradata(); 687911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 688011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 688111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 688211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_out_bm_count,i)) { 688311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i); 688411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 688511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 688611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 688711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 688811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 688911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < drv_ctx.op_buf.actualcount) { 689011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 689111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 689211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 689311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 689411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 689511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].buffer_len = 689611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size; 689711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 689811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_out_mem_ptr + i ); 689911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode) { 690011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 690111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = 690211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_U8 *)(intptr_t)drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 690311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 690411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 690511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 690611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 690711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size; 690811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 690911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = i; 691011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 691111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 691211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = drv_ctx.op_buf.buffer_size; 691311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 691411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 691511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 691611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 691711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 691811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 691911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = 0; 692011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 692111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 692211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 692311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 692411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 692511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 692611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 692711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 692811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].data_offset = 0; 692911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 693011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx); 693111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 693211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 693311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = plane; 693411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = drv_ctx.num_planes; 693511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr); 693611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 693711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 693811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 693911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 694011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 694111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 694211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) { 694311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 694411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 694511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 694611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 694711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 694811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 694911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = true; 695011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("STREAMON Successful"); 695111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 695211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 695311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enabling Turbo mode"); 695411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel request_perf_level(VIDC_TURBO); 695511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 695611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 695711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr; 695811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pAppPrivate = appData; 695911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_out_bm_count,i); 696011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 696111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient"); 696211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 696311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 696411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 696511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 696611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 696711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 696811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 696911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 697011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// AllocateBuffer -- API Call 697111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 697211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 697311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::AllocateBuffer 697411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 697511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 697611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns zero if all the buffers released.. 697711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 697811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 697911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 698011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 698111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 698211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 698311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 698411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 698511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp, 698611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 698711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 698811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 698911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes) 699011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 699111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 699211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type 699311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 699411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port); 699511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 699611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Allocate Buf in Invalid State"); 699711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 699811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 699911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 700011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX) { 7001fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // If this is not the first allocation (i.e m_inp_mem_ptr is allocated), 7002fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // ensure that use-buffer was never called. 7003fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Mix-and-match of useBuffer and allocateBuffer is not allowed 7004fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_inp_mem_ptr && input_use_buffer) { 7005fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("'Allocate' Input buffer called after 'Use' Input buffer !"); 7006fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUndefined; 7007fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 700811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 700911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes); 701011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 701111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes); 701211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 701311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 701411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port, 701511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel appData,bytes); 701611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 701711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port); 701811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 701911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 702011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done"); 702111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 702211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocate_done()) { 702311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 702411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 702511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 702611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandStateSet,OMX_StateIdle, 702711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 702811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 702911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 703011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) { 703111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 703211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 703311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 703411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX, 703511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 703611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 703711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 703811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) { 703911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 704011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 704111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 704211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, 704311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 704411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 704511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 704611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 704711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet); 704811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 704911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 705011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 705111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Free Buffer - API call 705211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 705311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 705411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::FreeBuffer 705511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 705611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 705711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 705811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 705911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 706011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 706111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 706211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 706311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 706411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 706511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp, 706611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 706711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 706811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 706911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 707011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int nPortIndex; 707111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 707211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("In for decoder free_buffer"); 707311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 707411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateIdle && 707511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 707611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" free buffer while Component in Loading pending"); 707711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)|| 707811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) { 707911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Buffer while port %u disabled", (unsigned int)port); 708011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((port == OMX_CORE_INPUT_PORT_INDEX && 708111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) || 708211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (port == OMX_CORE_OUTPUT_PORT_INDEX && 708311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) { 708411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Buffer while port %u enable pending", (unsigned int)port); 708511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) { 708611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled"); 708711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError, 708811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorPortUnpopulated, 708911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 709011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 709111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 709211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_state != OMX_StateInvalid) { 709311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers"); 709411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError, 709511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorPortUnpopulated, 709611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 709711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 709811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 709911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX) { 710011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if arbitrary bytes*/ 710111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!arbitrary_bytes && !input_use_buffer) 710211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - m_inp_mem_ptr; 710311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 710411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - m_inp_heap_ptr; 710511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 710611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex); 710711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nPortIndex < drv_ctx.ip_buf.actualcount && 710811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_inp_bm_count, nPortIndex)) { 710911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Clear the bit associated with it. 711011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); 711111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex); 711211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_use_buffer == true) { 711311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 711411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex); 711511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_phdr_pmem_ptr) 711611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer(m_phdr_pmem_ptr[nPortIndex]); 711711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 711811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 711911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_phdr_pmem_ptr) 712011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]); 712111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 712211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer(nPortIndex,NULL); 712311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 712411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer(buffer); 712511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 712611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bPopulated = OMX_FALSE; 712711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(release_input_done()) 712811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel release_buffers(this, VDEC_BUFFER_TYPE_INPUT); 712911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Free the Buffer Header*/ 713011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_input_done()) { 713111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ALL input buffers are freed/released"); 713211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer_header(); 713311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 713411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 713511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid"); 713611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 713711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 713811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 713911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING) 714011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_input_done()) { 714111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 714211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING); 714311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable, 714411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX, 714511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 714611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 714711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 714811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // check if the buffer is valid 714911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 715011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nPortIndex < drv_ctx.op_buf.actualcount && 715111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_out_bm_count, nPortIndex)) { 715211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex); 715311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Clear the bit associated with it. 715411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_out_bm_count,nPortIndex); 715511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bPopulated = OMX_FALSE; 715611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_buffers.free_output_buffer (buffer); 715711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 715811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(release_output_done()) { 715911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel release_buffers(this, VDEC_BUFFER_TYPE_OUTPUT); 716011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 716111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_output_done()) { 716211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_output_buffer_header(); 716311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 716411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 716511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid"); 716611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 716711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 716811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING) 716911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_output_done()) { 717011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it"); 717111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 717211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 717311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 717411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 717511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 717611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers"); 717711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 717811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 717911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 718011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 718111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable, 718211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, 718311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 718411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 718511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 718611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 718711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 718811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((eRet == OMX_ErrorNone) && 718911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 719011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_done()) { 719111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 719211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); 719311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandStateSet, OMX_StateLoaded, 719411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 719511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 719611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 719711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 719811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 719911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 720011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 720111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 720211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 720311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::EmptyThisBuffer 720411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 720511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 720611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel This routine is used to push the encoded video frames to 720711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel the video decoder. 720811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 720911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 721011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 721111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 721211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 721311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything went successful. 721411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 721511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 721611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 721711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 721811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 721911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret1 = OMX_ErrorNone; 722011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount; 722111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 722211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateExecuting && 722311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state != OMX_StatePause && 722411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state != OMX_StateIdle) { 722511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Empty this buffer in Invalid State"); 722611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 722711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 722811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 722911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL) { 723011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL"); 723111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 723211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 723311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 723411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_inp_bEnabled) { 723511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled."); 723611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 723711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 723811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 723911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) { 724011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %u", (unsigned int)buffer->nInputPortIndex); 724111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 724211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 724311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 724411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (perf_flag) { 724511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!latency) { 724611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec_time.stop(); 724711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel latency = dec_time.processing_time_us(); 724811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec_time.start(); 724911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 725011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 725111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 725211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 725311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufferIndex = buffer - m_inp_heap_ptr; 725411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 725511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_use_buffer == true) { 725611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufferIndex = buffer - m_inp_heap_ptr; 7257fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) { 7258fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("ERROR: ETB nBufferIndex is invalid in use-buffer mode"); 7259fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorBadParameter; 7260fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 726111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen; 726211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp; 726311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags; 726411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer = &m_inp_mem_ptr[nBufferIndex]; 726511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %u", 726611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, (unsigned int)buffer->nFilledLen); 726711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 726811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufferIndex = buffer - m_inp_mem_ptr; 726911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 727011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 727111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7272fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) { 727311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid"); 727411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 727511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 727611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 727711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 727811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_config_flag = true; 727911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__); 728011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 728111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 728211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* The client should not set this when codec is in arbitrary bytes mode */ 728311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pass_buffer_fd) { 728411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->pBuffer = (OMX_U8*)drv_ctx.ptr_inputbuffer[nBufferIndex].bufferaddr; 728511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 728611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 728711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%u)", 728811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer, buffer->pBuffer, buffer->nTimeStamp, (unsigned int)buffer->nFilledLen); 728911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 729011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)hComp,(unsigned long)buffer, 729111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_ETB_ARBITRARY); 729211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 729311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)hComp,(unsigned long)buffer,OMX_COMPONENT_GENERATE_ETB); 729411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 729511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.insert_timestamp(buffer); 729611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 729711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 729811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 729911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 730011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 730111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::empty_this_buffer_proxy 730211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 730311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 730411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel This routine is used to push the encoded video frames to 730511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel the video decoder. 730611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 730711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 730811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 730911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 731011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 731111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything went successful. 731211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 731311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 731411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, 731511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 731611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 7317b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_HIGH("ETB"); 731811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 731911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int push_cnt = 0,i=0; 732011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned nPortIndex = 0; 732111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 732211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_input_frameinfo frameinfo; 732311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_bufferpayload *temp_buffer; 732411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_seqheader seq_header; 732511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool port_setting_changed = true; 732611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 732711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Should we generate a Aync error event*/ 732811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL || buffer->pInputPortPrivate == NULL) { 732911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid"); 733011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 733111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 733211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 733311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 733411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7335fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (nPortIndex >= drv_ctx.ip_buf.actualcount) { 733611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]", 733711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex); 733811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 733911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 734011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 734111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers++; 7342b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 734311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 734411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* return zero length and not an EOS buffer */ 734511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!arbitrary_bytes && (buffer->nFilledLen == 0) && 734611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) { 734711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("return zero legth buffer"); 734811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer,VDEC_S_SUCCESS, 734911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 735011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 735111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 735211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 735311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_flush_progress == true) { 735411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Flush in progress return buffer "); 735511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer,VDEC_S_SUCCESS, 735611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 735711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 735811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 735911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 736011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel auto_lock l(buf_lock); 736111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate; 736211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 736311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!temp_buffer || (temp_buffer - drv_ctx.ptr_inputbuffer) > (int)drv_ctx.ip_buf.actualcount) { 736411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 736511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 736611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* If its first frame, H264 codec and reject is true, then parse the nal 736711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel and get the profile. Based on this, reject the clip playback */ 736811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 && 736911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_reject_avc_1080p_mp) { 737011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel first_frame = 1; 737111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Parse nal to get the profile"); 737211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser->parse_nal((OMX_U8*)buffer->pBuffer, buffer->nFilledLen, 737311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NALU_TYPE_SPS); 737411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile = h264_parser->get_profile(); 737511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = is_video_session_supported(); 737611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 737711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_EBD); 737811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError, OMX_ErrorInvalidState,OMX_COMPONENT_GENERATE_EVENT); 737911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Move the state to Invalid to avoid queueing of pending ETB to the driver */ 738011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StateInvalid; 738111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 738211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 738311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 738411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7385b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-TS", buffer->nTimeStamp / 1000); 7386b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-size", buffer->nFilledLen); 738711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 738811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*for use buffer we need to memcpy the data*/ 738911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp_buffer->buffer_len = buffer->nFilledLen; 739011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73917b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan if (input_use_buffer && temp_buffer->bufferaddr && !secure_mode) { 739211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFilledLen <= temp_buffer->buffer_len) { 739311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 739411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 739511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 739611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset), 739711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen); 739811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 739911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 740011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 740111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 740211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 740311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 740411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 740511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.bufferaddr = temp_buffer->bufferaddr; 740611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.client_data = (void *) buffer; 740711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.datalen = temp_buffer->buffer_len; 740811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.flags = 0; 740911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.offset = buffer->nOffset; 741011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.pmem_fd = temp_buffer->pmem_fd; 741111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.pmem_offset = temp_buffer->offset; 741211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.timestamp = buffer->nTimeStamp; 741311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) { 741411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETB: dmx enabled"); 741511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_demux_entries == 0) { 741611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extract_demux_addr_offsets(buffer); 741711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 741811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 741911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%u",(unsigned int)m_demux_entries); 742011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle_demux_data(buffer); 742111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr; 742211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size; 742311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 742411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.desc_addr = NULL; 742511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.desc_size = 0; 742611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 742711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!arbitrary_bytes) { 742811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.flags |= buffer->nFlags; 742911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 743011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 743111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 743211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_timestamp) { 743311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 743411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 743511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.insert_ts(buffer->nTimeStamp); 743611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 743711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 743811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.insert_ts(buffer->nTimeStamp); 743911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 744011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 744111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 744211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 744311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel log_input_buffers((const char *)temp_buffer->bufferaddr, temp_buffer->buffer_len); 744411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 744511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelif (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { 744611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 744711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 744811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 744911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 745011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 745111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached"); 745211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.flags |= VDEC_BUFFERFLAG_EOS; 745311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 745411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count = 0; 745511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = false; 745611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count = 0; 745711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils) 745811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->initialize_frame_checking_environment(); 745911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.flush(); 746011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts = LLONG_MAX; 746111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_flags = 0; 746211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 746311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_entries = 0; 746411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 746511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 746611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane; 746711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset( (void *)&buf, 0, sizeof(buf)); 746811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset( (void *)&plane, 0, sizeof(plane)); 746911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 747011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long print_count; 747111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 747211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags = V4L2_QCOM_BUF_FLAG_EOS; 747311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("INPUT EOS reached") ; 747411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 747511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 747611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = nPortIndex; 747711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 747811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 747911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.bytesused = temp_buffer->buffer_len; 748011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.length = drv_ctx.ip_buf.buffer_size; 748111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.m.userptr = (unsigned long)temp_buffer->bufferaddr - 748211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)temp_buffer->offset; 748311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.reserved[0] = temp_buffer->pmem_fd; 748411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.reserved[1] = temp_buffer->offset; 748511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.data_offset = 0; 748611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = &plane; 748711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = 1; 748811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frameinfo.timestamp >= LLONG_MAX) { 748911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID; 749011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 749111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //assumption is that timestamp is in milliseconds 749211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.timestamp.tv_sec = frameinfo.timestamp / 1000000; 749311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000); 749411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0; 749511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_DECODEONLY) ? V4L2_QCOM_BUF_FLAG_DECODEONLY: 0; 749611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 749711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 749811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Increment codec_config buffer counter"); 749911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel android_atomic_inc(&m_queued_codec_config_count); 750011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 750111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 750211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 750311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 750411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver, send ETB back to client"); 750511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(hComp, m_app_data, buffer); 750611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 750711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 750811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 750911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 751011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_config_flag = false; 751111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 751211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!streaming[OUTPUT_PORT]) { 751311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 751411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret,r; 751511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 751611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 751711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 751811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 751911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ret) { 752011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful"); 752111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[OUTPUT_PORT] = true; 752211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (errno == EBUSY) { 752311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call stream on OUTPUT due to HW_OVERLOAD"); 752411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer, VDEC_S_SUCCESS, 752511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 752611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 752711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 752811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT"); 752911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued"); 753011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer, VDEC_S_SUCCESS, 753111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 753211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 753311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 753411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 753511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%u)", 753611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.bufferaddr, (long long)frameinfo.timestamp, 753711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)frameinfo.datalen); 753811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 753911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 754011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 754111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 754211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 754311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 754411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::FillThisBuffer 754511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 754611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 754711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel IL client uses this method to release the frame buffer 754811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel after displaying them. 754911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 755011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 755111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 755211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 755311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 755411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 755511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 755611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 755711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 755811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 755911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 756011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateExecuting && 756111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state != OMX_StatePause && 756211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state != OMX_StateIdle) { 756311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FTB in Invalid State"); 756411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 756511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 756611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 756711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_out_bEnabled) { 756811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled."); 756911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 757011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 757111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 757211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned nPortIndex = 0; 757311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dynamic_buf_mode) { 757411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = NULL; 757511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct VideoDecoderOutputMetaData *meta; 757611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int nPortIndex = 0; 757711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 757811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!buffer || !buffer->pBuffer) { 757911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: invalid params: %p", __FUNCTION__, buffer); 758011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 758111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 758211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 758311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //get the buffer type and fd info 758411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta = (struct VideoDecoderOutputMetaData *)buffer->pBuffer; 758511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)meta->pHandle; 758611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FTB: metabuf: %p buftype: %d bufhndl: %p ", meta, meta->eType, meta->pHandle); 758711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 758811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!handle) { 758911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FTB: Error: IL client passed an invalid buf handle - %p", handle); 759011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 759111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 759211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Fill outputbuffer with buffer details, this will be sent to f/w during VIDIOC_QBUF 759311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 759411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nPortIndex < drv_ctx.op_buf.actualcount && 759511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) { 759611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd = handle->fd; 759711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = (OMX_U8*) buffer; 759811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 759911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Store private handle from GraphicBuffer 760011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[nPortIndex].privatehandle = handle; 760111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[nPortIndex].nativehandle = handle; 760211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 760311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("[FTB]Invalid native_buffer index: %d", nPortIndex); 760411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 760511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 760611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 760711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //buffer->nAllocLen will be sizeof(struct VideoDecoderOutputMetaData). Overwrite 760811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //this with a more sane size so that we don't compensate in rest of code 760911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //We'll restore this size later on, so that it's transparent to client 761011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 761111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nAllocLen = handle->size; 761211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 761311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (handle->flags & private_handle_t::PRIV_FLAGS_DISP_CONSUMER) { 761411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_is_display_session = true; 761511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 761611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_is_display_session = false; 761711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 761811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s: m_is_display_session = %d", __func__, m_is_display_session); 761911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 762011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size = handle->size; 762111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 762211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 762311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 762411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL || 762511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (nPortIndex >= drv_ctx.op_buf.actualcount)) { 762611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index, nPortIndex %u bufCount %u", 762711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex, drv_ctx.op_buf.actualcount); 762811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 762911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 763011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 763111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) { 763211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %u", (unsigned int)buffer->nOutputPortIndex); 763311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 763411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 763511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 763611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 763711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event((unsigned long) hComp, (unsigned long)buffer, m_fill_output_msg); 763811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 763911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 764011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 764111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 764211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::fill_this_buffer_proxy 764311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 764411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 764511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel IL client uses this method to release the frame buffer 764611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel after displaying them. 764711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 764811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 764911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 765011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 765111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 765211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 765311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 765411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 765511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( 765611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 765711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd) 765811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 7659b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_HIGH("FTB"); 766011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE nRet = OMX_ErrorNone; 766111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *buffer = bufferAdd; 766211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned nPortIndex = 0; 766311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_fillbuffer_cmd fillbuffer; 766411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_bufferpayload *ptr_outputbuffer = NULL; 766511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_output_frameinfo *ptr_respbuffer = NULL; 766611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 766711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 766811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7669fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (bufferAdd == NULL || nPortIndex >= drv_ctx.op_buf.actualcount) { 767011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u", 767111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex, drv_ctx.op_buf.actualcount); 767211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 767311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 767411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 767511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p", 767611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferAdd, bufferAdd->pBuffer); 767711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Return back the output buffer to client*/ 767811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true || in_reconfig) { 767911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Output Buffers return flush/disable condition"); 768011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 768111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone (hComp,m_app_data,buffer); 768211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 768311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 768411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 768511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dynamic_buf_mode) { 768611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].offset = 0; 768711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len = buffer->nAllocLen; 768811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ref_add(nPortIndex); 768911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].mmaped_size = buffer->nAllocLen; 769011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 769111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 769211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers++; 7693b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers); 769411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer = client_buffers.get_dr_buf_hdr(bufferAdd); 769511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!buffer) { 769611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("err: client_buffer ptr invalid"); 769711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 769811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 769911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate; 770011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ptr_respbuffer) { 770111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data; 770211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 770311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 770411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) { 770511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL"); 770611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 770711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone (hComp,m_app_data,buffer); 770811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers--; 7709b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers); 771011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 771111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 771211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 771311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 771411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 771511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 771611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset( (void *)&buf, 0, sizeof(buf)); 771711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES)); 771811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int extra_idx = 0; 771911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 772011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = nPortIndex; 772111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 772211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 772311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].bytesused = buffer->nFilledLen; 772411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = buffer->nAllocLen; 772511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = 772611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr - 772711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset; 772811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 772911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset; 773011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = 0; 773111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 773211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 773311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].bytesused = 0; 773411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 773511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size); 773611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 773711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 773811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 773911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size; 774011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].data_offset = 0; 774111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 774211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx); 774311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 774411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 774511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = plane; 774611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = drv_ctx.num_planes; 774711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("SENDING FTB TO F/W - fd[0] = %d fd[1] = %d offset[1] = %d in_flush = %d", 774811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], output_flush_progress); 774911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 775011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 775111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 775211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 775311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 775411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to qbuf to driver, send FTB back to client"); 775511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone(hComp, m_app_data, buffer); 775611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 775711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelreturn OMX_ErrorNone; 775811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 775911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 776011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 776111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 776211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::SetCallbacks 776311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 776411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 776511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Set the callbacks. 776611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 776711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 776811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 776911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 777011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 777111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 777211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 777311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 777411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE hComp, 777511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_CALLBACKTYPE* callbacks, 777611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData) 777711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 777811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 777911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb = *callbacks; 778011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\ 778111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EventHandler,m_cb.FillBufferDone); 778211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data = appData; 778311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 778411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 778511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 778611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 778711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 778811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ComponentDeInit 778911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 779011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 779111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Destroys the component and release memory allocated to the heap. 779211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 779311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 779411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 779511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 779611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 779711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 779811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 779911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 780011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp) 780111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 780211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 780311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 780411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 780511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_StateLoaded != m_state) { 780611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\ 780711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state); 780811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Playback Ended - FAILED"); 780911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 781011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Playback Ended - PASSED"); 781111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 781211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 781311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if the output buffers have to be cleaned up*/ 781411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 781511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Freeing the Output Memory"); 781611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) { 781711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_out_bm_count, i)) { 781811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_out_bm_count, i); 781911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_buffers.free_output_buffer (&m_out_mem_ptr[i]); 782011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 782111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 782211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_output_done()) { 782311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 782411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 782511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 782611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 782711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 782811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 782911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 783011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 783111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if the input buffers have to be cleaned up*/ 783211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr || m_inp_heap_ptr) { 783311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Freeing the Input Memory"); 783411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) { 783511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 783611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_inp_bm_count, i)) { 783711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_inp_bm_count, i); 783811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr) 783911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer (i,&m_inp_mem_ptr[i]); 784011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 784111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer (i,NULL); 784211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 784311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 784411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_input_done()) { 784511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 784611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 784711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 784811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 784911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer_header(); 785011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_output_buffer_header(); 785111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.pBuffer) { 785211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(h264_scratch.pBuffer); 785311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer = NULL; 785411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 785511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 785611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_parser) { 785711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel delete h264_parser; 785811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser = NULL; 785911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 786011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 786111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils) { 786211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free utils parser"); 786311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel delete (m_frame_parser.mutils); 786411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils = NULL; 786511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 786611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 786711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_platform_list) { 786811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_platform_list); 786911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list = NULL; 787011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 787111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_vendor_config.pData) { 787211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_vendor_config.pData); 787311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_vendor_config.pData = NULL; 787411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 787511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 787611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Reset counters in mesg queues 787711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.m_size=0; 787811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cmd_q.m_size=0; 787911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.m_size=0; 788011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.m_read = m_ftb_q.m_write =0; 788111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cmd_q.m_read = m_cmd_q.m_write =0; 788211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.m_read = m_etb_q.m_write =0; 788311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 788411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_timestamp) { 788511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.reset_ts_list(); 788611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 788711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 788811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 788911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG"); 789011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 789111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // NULL); 789211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Close the driver instance"); 789311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 789411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.infile) { 789511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(m_debug.infile); 789611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.infile = NULL; 789711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 789811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.outfile) { 789911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(m_debug.outfile); 790011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.outfile = NULL; 790111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 790211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.out_ymeta_file) { 790311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(m_debug.out_ymeta_file); 790411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_ymeta_file = NULL; 790511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 790611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.out_uvmeta_file) { 790711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(m_debug.out_uvmeta_file); 790811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_uvmeta_file = NULL; 790911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 791011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG 791111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (outputExtradataFile) 791211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose (outputExtradataFile); 791311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 791411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("omx_vdec::component_deinit() complete"); 791511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 791611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 791711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 791811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 791911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 792011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::UseEGLImage 792111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 792211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 792311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Use EGL Image method implementation <TBD>. 792411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 792511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 792611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 792711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 792811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 792911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Not Implemented error. 793011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 793111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 793211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp, 793311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 793411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 793511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 793611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN void* eglImage) 793711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 793811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) appData; 793911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list; 794011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry; 794111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info; 794211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 794311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU 794411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc; 794511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel EGLint fd = -1, offset = 0,pmemPtr = 0; 794611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 794711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fd = -1, offset = 0; 794811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 794911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("use EGL image support for decoder"); 795011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) { 795111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid EGL image"); 795211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 795311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU 795411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_display_id == NULL) { 795511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Display ID is not set by IL client"); 795611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 795711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 795811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC) 795911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eglGetProcAddress("eglQueryImageKHR"); 796011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE, &fd); 796111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET, &offset); 796211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR, &pmemPtr); 796311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else //with OMX test app 796411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct temp_egl { 796511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pmem_fd; 796611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int offset; 796711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel }; 796811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct temp_egl *temp_egl_id = NULL; 796911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel void * pmemPtr = (void *) eglImage; 797011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp_egl_id = (struct temp_egl *)eglImage; 797111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (temp_egl_id != NULL) { 797211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = temp_egl_id->pmem_fd; 797311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel offset = temp_egl_id->offset; 797411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 797511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 797611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 797711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd); 797811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 797911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 798011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_info.pmem_fd = (OMX_U32) fd; 798111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_info.offset = (OMX_U32) offset; 798211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_entry.entry = (void *) &pmem_info; 798311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 798411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list.entryList = &pmem_entry; 798511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list.nEntries = 1; 798611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ouput_egl_buffers = true; 798711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port, 798811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void *)&pmem_list, drv_ctx.op_buf.buffer_size, 798911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_U8 *)pmemPtr)) { 799011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("use buffer call failed for egl image"); 799111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 799211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 799311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 799411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 799511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 799611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 799711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 799811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ComponentRoleEnum 799911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 800011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 800111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Component Role Enum method implementation. 800211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 800311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 800411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 800511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 800611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 800711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything is successful. 800811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 800911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, 801011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_U8* role, 801111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 index) 801211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 801311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 801411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 801511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 801611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 801711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 801811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 801911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 802011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 802111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 802211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 802311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 802411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 802511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 802611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 802711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 802811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 802911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 803011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 803111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 803211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 803311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 803411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 803511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 803611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 803711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 803811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 803911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 804011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 804111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 804211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))) { 804311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 804411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 804511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 804611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 804711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 804811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 804911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 805011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 805111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 805211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 805311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 805411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 805511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 805611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 805711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 805811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 805911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 806011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE); 806111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 806211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 806311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 806411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 806511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 806611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 806711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 806811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE); 806911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s", role); 807011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 807111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 807211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 807311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 807411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 807511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 807611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) { 807711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 807811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 807911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 808011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 808111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 808211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 808311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 808411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 808511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 808611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 808711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 808811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 808911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 809011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 809111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 809211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) { 809311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 809411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE); 809511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 809611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 809711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 809811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 809911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 810011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 810111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component"); 810211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidComponentName; 810311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 810411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 810511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 810611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 810711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 810811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 810911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 811011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 811111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 811211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::AllocateDone 811311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 811411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 811511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if entire buffer pool is allocated by IL Client or not. 811611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Need this to move to IDLE state. 811711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 811811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 811911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 812011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 812111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 812211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false. 812311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 812411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 812511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_done(void) 812611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 812711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 812811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet_In = false; 812911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet_Out = false; 813011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 813111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet_In = allocate_input_done(); 813211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet_Out = allocate_output_done(); 813311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 813411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bRet_In && bRet_Out) { 813511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 813611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 813711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 813811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 813911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 814011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 814111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 814211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::AllocateInputDone 814311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 814411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 814511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if I/P buffer pool is allocated by IL Client or not. 814611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 814711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 814811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 814911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 815011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 815111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false. 815211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 815311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 815411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_input_done(void) 815511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 815611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 815711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i=0; 815811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 815911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr == NULL) { 816011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 816111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 816211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr ) { 816311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; i<drv_ctx.ip_buf.actualcount; i++) { 816411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 816511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 816611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 816711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 816811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 816911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i == drv_ctx.ip_buf.actualcount) { 817011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 817111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Allocate done for all i/p buffers"); 817211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 817311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) { 817411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bPopulated = OMX_TRUE; 817511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 817611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 817711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 817811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 817911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 818011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::AllocateOutputDone 818111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 818211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 818311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if entire O/P buffer pool is allocated by IL Client or not. 818411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 818511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 818611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 818711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 818811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 818911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false. 819011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 819111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 819211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_output_done(void) 819311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 819411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 819511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned j=0; 819611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 819711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr == NULL) { 819811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 819911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 820011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 820111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 820211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; j < drv_ctx.op_buf.actualcount; j++) { 820311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_out_bm_count,j)) { 820411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 820511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 820611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 820711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 820811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 820911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (j == drv_ctx.op_buf.actualcount) { 821011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 821111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Allocate done for all o/p buffers"); 821211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_bEnabled) 821311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bPopulated = OMX_TRUE; 821411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 821511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 821611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 821711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 821811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 821911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 822011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 822111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ReleaseDone 822211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 822311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 822411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if IL client has released all the buffers. 822511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 822611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 822711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 822811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 822911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 823011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 823111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 823211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 823311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_done(void) 823411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 823511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 823611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 823711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_input_done()) { 823811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_output_done()) { 823911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 824011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 824111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 824211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 824311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 824411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 824511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 824611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 824711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 824811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ReleaseOutputDone 824911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 825011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 825111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if IL client has released all the buffers. 825211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 825311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 825411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 825511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 825611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 825711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 825811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 825911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 826011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_output_done(void) 826111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 826211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 826311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i=0,j=0; 826411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 826511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p", m_out_mem_ptr); 826611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 826711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; j < drv_ctx.op_buf.actualcount ; j++) { 826811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_out_bm_count,j)) { 826911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 827011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 827111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 827211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (j == drv_ctx.op_buf.actualcount) { 827311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count = 0; 827411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 827511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 827611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 827711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count = 0; 827811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 827911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 828011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 828111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 828211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 828311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 828411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ReleaseInputDone 828511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 828611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 828711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if IL client has released all the buffers. 828811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 828911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 829011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 829111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 829211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 829311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 829411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 829511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 829611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_input_done(void) 829711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 829811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 829911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i=0,j=0; 830011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 830111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr); 830211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr) { 830311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; j<drv_ctx.ip_buf.actualcount; j++) { 830411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( BITMASK_PRESENT(&m_inp_bm_count,j)) { 830511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 830611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 830711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 830811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (j==drv_ctx.ip_buf.actualcount) { 830911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 831011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 831111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 831211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 831311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 831411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 831511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 831611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 831711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp, 831811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE * buffer) 831911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 8320b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_HIGH("FBD"); 832111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL; 832211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!buffer || (buffer - m_out_mem_ptr) >= (int)drv_ctx.op_buf.actualcount) { 832311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer); 832411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 832511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (output_flush_progress) { 832611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer); 832711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 832811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nTimeStamp = 0; 832911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 833011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 833111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 833211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 833311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 833411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_extradata) { 833511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { 833611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("***************************************************"); 833711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received"); 833811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("***************************************************"); 833911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 834011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 834111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) { 834211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("***************************************************"); 834311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received"); 834411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("***************************************************"); 834511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 834611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 834711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 834811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 834911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, flags: 0x%x, timestamp: %lld", 835011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer, buffer->pBuffer, buffer->nFlags, buffer->nTimeStamp); 835111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers --; 8352b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers); 835311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 835411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 835511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Output EOS has been reached"); 835611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!output_flush_progress) 835711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event((unsigned)NULL, (unsigned)NULL, 835811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EOS_DONE); 835911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 836011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame) { 836111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame); 836211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 836311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 836411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) { 836511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 836611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.insert_entry((unsigned long) pdest_frame,(unsigned)NULL, 836711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL); 836811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 836911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 837011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 837111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 837211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG 837311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (outputExtradataFile) { 837411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int buf_index = buffer - m_out_mem_ptr; 837511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr); 837611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 837711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OTHER_EXTRADATATYPE *p_extra = NULL; 837811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) 837911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((unsigned long)(pBuffer + buffer->nOffset + buffer->nFilledLen + 3)&(~3)); 838011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 838111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (p_extra && (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) ) { 838211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%x", 838311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nSize, p_extra->eType); 838411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite (p_extra,1,p_extra->nSize,outputExtradataFile); 838511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 838611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_extra->eType == OMX_ExtraDataNone) { 838711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 838811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 838911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 839011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 839111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 839211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 839311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 839411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* For use buffer we need to copy the data */ 839511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!output_flush_progress) { 839611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* This is the error check for non-recoverable errros */ 839711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool is_duplicate_ts_valid = true; 839811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool is_interlaced = (drv_ctx.interlace != VDEC_InterlaceFrameProgressive); 839911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 840011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_capability == V4L2_PIX_FMT_MPEG4 || 840111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability == V4L2_PIX_FMT_MPEG2 || 840211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability == V4L2_PIX_FMT_DIVX || 840311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability == V4L2_PIX_FMT_DIVX_311) 840411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_duplicate_ts_valid = false; 840511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 840611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((output_capability == V4L2_PIX_FMT_H264 || 840711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability == V4L2_PIX_FMT_H264_MVC) && 840811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_interlaced) { 840911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF) { 841011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_interlaced = false; 841111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 841211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 841311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 841411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFilledLen > 0) { 841511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.get_next_timestamp(buffer, 841611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_interlaced && is_duplicate_ts_valid); 841711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_timestamp) { 841811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 841911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TICKS expected_ts = 0; 842011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.pop_min_ts(expected_ts); 842111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_interlaced && is_duplicate_ts_valid) { 842211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.pop_min_ts(expected_ts); 842311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 842411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list", 842511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nTimeStamp, expected_ts); 842611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 842711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nTimeStamp != expected_ts) { 842811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check"); 842911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 843011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 843111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 843211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 843311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 8434b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FBD-TS", buffer->nTimeStamp / 1000); 843511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 843611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_cb.FillBufferDone) { 843711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFilledLen > 0) { 843811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) 843911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel adjust_timestamp(buffer->nTimeStamp); 844011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 844111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel set_frame_rate(buffer->nTimeStamp); 844211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8443fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel proc_frms++; 844411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (perf_flag) { 8445fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (1 == proc_frms) { 844611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec_time.stop(); 844711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel latency = dec_time.processing_time_us() - latency; 844811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3); 844911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec_time.start(); 845011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fps_metrics.start(); 845111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 845211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 845311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U64 proc_time = 0; 845411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fps_metrics.stop(); 845511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel proc_time = fps_metrics.processing_time_us(); 845611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%u) proc_time(%.2f)S fps(%.2f)", 845711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)proc_frms, (float)proc_time / 1e6, 845811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (float)(1e6 * proc_frms) / proc_time); 845911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 846011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 846111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 846211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 846311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = LLONG_MAX; 846411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = true; 8465fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel proc_frms = 0; 846611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 846711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 846811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 846911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((OMX_QCOM_PLATFORM_PRIVATE_LIST *) 847011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->pPlatformPrivate)->entryList->entry; 847111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %lu",pPMEMInfo->pmem_fd); 847211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *il_buffer; 847311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel il_buffer = client_buffers.get_il_buf_hdr(buffer); 847411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 current_framerate = (int)(drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator); 847511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 847611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (il_buffer && m_last_rendered_TS >= 0) { 847711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TICKS ts_delta = (OMX_TICKS)llabs(il_buffer->nTimeStamp - m_last_rendered_TS); 847811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 847911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Current frame can be send for rendering if 848011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (a) current FPS is <= 60 848111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (b) is the next frame after the frame with TS 0 848211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (c) is the first frame after seek 848311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (d) the delta TS b\w two consecutive frames is > 16 ms 848411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (e) its TS is equal to previous frame TS 848511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (f) if marked EOS 848611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 848711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(current_framerate <= 60 || m_last_rendered_TS == 0 || 848811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel il_buffer->nTimeStamp == 0 || ts_delta >= 16000 || 848911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts_delta == 0 || (il_buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 849011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_last_rendered_TS = il_buffer->nTimeStamp; 849111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 849211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //mark for droping 849311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 849411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 849511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 849611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" -- %s Frame -- info:: fps(%d) lastRenderTime(%lld) bufferTs(%lld) ts_delta(%lld)", 849711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen? "Rendering":"Dropping",current_framerate,m_last_rendered_TS, 849811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel il_buffer->nTimeStamp,ts_delta); 849911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 850011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //above code makes sure that delta b\w two consecutive frames is not 850111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //greater than 16ms, slow-mo feature, so cap fps to max 60 850211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (current_framerate > 60 ) { 850311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel current_framerate = 60; 850411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 850511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 850611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 850711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // add current framerate to gralloc meta data 8508af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel if ((buffer->nFilledLen > 0) && m_enable_android_native_buffers && m_out_mem_ptr) { 8509af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel // If valid fps was received, directly send it to display for the 1st fbd. 8510af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel // Otherwise, calculate fps using fbd timestamps 8511fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel float refresh_rate = m_fps_prev; 8512fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (m_fps_received) { 8513fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (1 == proc_frms) { 8514fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel refresh_rate = m_fps_received / (float)(1<<16); 8515fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 8516fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } else { 8517af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel // check if dynamic refresh rate change feature enabled or not 8518af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel if (m_drc_enable) { 8519af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel // set coarse fps when 2 fbds received and 8520af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel // set fps again when 30 fbds received as it should be 8521af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel // more accurate than the one set when only 2 fbds received. 8522af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel if (2 == proc_frms || 30 == proc_frms) { 8523af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel if (drv_ctx.frame_rate.fps_denominator) { 8524af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel refresh_rate = drv_ctx.frame_rate.fps_numerator / 8525af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel (float) drv_ctx.frame_rate.fps_denominator; 8526af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } 8527af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } 8528af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } else { 8529af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel // calculate and set refresh rate for every frame from second frame onwards 8530af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel // display will assume the default refresh rate for first frame (which is 60 fps) 8531af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel if (m_fps_prev) { 8532af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel if (drv_ctx.frame_rate.fps_denominator) { 8533af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel refresh_rate = drv_ctx.frame_rate.fps_numerator / 8534af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel (float) drv_ctx.frame_rate.fps_denominator; 8535af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } 8536af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel } 8537fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 8538fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 8539fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (refresh_rate > 60) { 8540fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel refresh_rate = 60; 8541fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 8542fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("frc set refresh_rate %f, frame %d", refresh_rate, proc_frms); 854311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 buf_index = buffer - m_out_mem_ptr; 854411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 8545fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel UPDATE_REFRESH_RATE, (void*)&refresh_rate); 8546fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_fps_prev = refresh_rate; 854711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 854811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 854911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFilledLen && m_enable_android_native_buffers && m_out_mem_ptr) { 855011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 buf_index = buffer - m_out_mem_ptr; 855111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("stereo_output_mode = %d",stereo_output_mode); 855211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 855311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel S3D_FORMAT, (void*)&stereo_output_mode); 855411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 855511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 855611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (il_buffer) { 855711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel log_output_buffers(il_buffer); 855811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dynamic_buf_mode) { 855911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int nPortIndex = 0; 856011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 856111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 856211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Since we're passing around handles, adjust nFilledLen and nAllocLen 856311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // to size of the handle. Do it _after_ log_output_buffers which 856411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // requires the respective sizes to be accurate. 856511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 856611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nAllocLen = sizeof(struct VideoDecoderOutputMetaData); 856711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = buffer->nFilledLen ? 856811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(struct VideoDecoderOutputMetaData) : 0; 856911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 857011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Clear graphic buffer handles in dynamic mode 857111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nPortIndex < drv_ctx.op_buf.actualcount && 857211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) { 857311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[nPortIndex].privatehandle = NULL; 857411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[nPortIndex].nativehandle = NULL; 857511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 857611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("[FBD]Invalid native_buffer index: %d", nPortIndex); 857711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 857811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 857911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 858011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone (hComp,m_app_data,il_buffer); 858111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 858211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr"); 858311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 858411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 858511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd); 858611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 858711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 858811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 858911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 859011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED 859111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_smoothstreaming_mode && m_out_mem_ptr) { 859211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 buf_index = buffer - m_out_mem_ptr; 859311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BufferDim_t dim; 859411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *private_handle = NULL; 859511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dim.sliceWidth = framesize.nWidth; 859611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dim.sliceHeight = framesize.nHeight; 859711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_index < drv_ctx.op_buf.actualcount && 859811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS && 859911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[buf_index].privatehandle) 860011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle = native_buffer[buf_index].privatehandle; 860111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (private_handle) { 860211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set metadata: update buf-geometry with stride %d slice %d", 860311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dim.sliceWidth, dim.sliceHeight); 860411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setMetaData(private_handle, UPDATE_BUFFER_GEOMETRY, (void*)&dim); 860511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 860611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 860711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 860811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 860911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 861011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 861111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 861211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp, 861311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* buffer) 861411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 8615b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_HIGH("EBD"); 861611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nBufferIndex = buffer - m_inp_mem_ptr; 861711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8618fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (buffer == NULL || (nBufferIndex >= (int)drv_ctx.ip_buf.actualcount)) { 861911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer); 862011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 862111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 862211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 862311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, bufhdr->nFlags = 0x%x", 862411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer, buffer->pBuffer, buffer->nFlags); 862511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers--; 8626b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 862711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 862811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 862911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame == NULL && input_flush_progress == false) { 863011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer); 863111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = buffer; 863211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 863311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nTimeStamp = LLONG_MAX; 863411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel push_input_buffer (hComp); 863511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 863611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer); 863711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 863811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_input_free_q.insert_entry((unsigned long)buffer, 863911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL, (unsigned)NULL)) { 864011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error"); 864111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 864211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 864311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_cb.EmptyBufferDone) { 864411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 864511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_use_buffer == true) { 864611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr]; 864711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 864811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 864911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Restore the FD that we over-wrote in ETB */ 865011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pass_buffer_fd) { 865111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->pBuffer = (OMX_U8*)(uintptr_t)drv_ctx.ptr_inputbuffer[nBufferIndex].pmem_fd; 865211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 865311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 865411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(hComp ,m_app_data, buffer); 865511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 865611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 865711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 865811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 865911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::async_message_process (void *context, void* message) 866011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 866111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec* omx = NULL; 866211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo *vdec_msg = NULL; 866311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* omxhdr = NULL; 866411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer *v4l2_buf_ptr = NULL; 866511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane *plane = NULL; 866611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_output_frameinfo *output_respbuf = NULL; 866711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc=1; 866811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (context == NULL || message == NULL) { 866911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check"); 867011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 867111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 867211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg = (struct vdec_msginfo *)message; 867311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 867411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx = reinterpret_cast<omx_vdec*>(context); 867511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 867611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (vdec_msg->msgcode) { 867711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 867811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_EVT_HW_ERROR: 867911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 868011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 868111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 868211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 868311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_EVT_HW_OVERLOAD: 868411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 868511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD); 868611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 868711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 868811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_EVT_HW_UNSUPPORTED: 868911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 869011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING); 869111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 869211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 869311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_START_DONE: 869411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 869511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_START_DONE); 869611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 869711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 869811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_STOP_DONE: 869911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 870011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_STOP_DONE); 870111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 870211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 870311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_RESUME_DONE: 870411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 870511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_RESUME_DONE); 870611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 870711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 870811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_PAUSE_DONE: 870911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 871011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_PAUSE_DONE); 871111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 871211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 871311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_FLUSH_INPUT_DONE: 871411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 871511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH); 871611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 871711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE: 871811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 871911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH); 872011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 872111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_INPUT_FLUSHED: 872211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_INPUT_BUFFER_DONE: 872311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 872411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* omxhdr = (OMX_BUFFERHEADERTYPE* ) 872511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.input_frame_clientdata; */ 872611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 872711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata; 872811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->m_inp_mem_ptr == NULL || v4l2_buf_ptr == NULL || 872911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr->index >= omx->drv_ctx.ip_buf.actualcount) { 873011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr = NULL; 873111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->status_code = VDEC_S_EFATAL; 873211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 873311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 873411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 873511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr = omx->m_inp_mem_ptr + v4l2_buf_ptr->index; 873611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 873711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED) { 873811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Unsupported input"); 873911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 874011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 874111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 874211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) { 874311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 874411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR; 874511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 874611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 874711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 874811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Decrement codec_config buffer counter"); 874911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel android_atomic_dec(&omx->m_queued_codec_config_count); 875011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((android_atomic_add(0, &omx->m_queued_codec_config_count) == 0) && 875111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&omx->m_flags, OMX_COMPONENT_FLUSH_DEFERRED)) { 875211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("sem post for CODEC CONFIG buffer"); 875311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post(&omx->m_safe_flush); 875411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 875511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 875611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || 875711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) { 875811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME; 875911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 876011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned long)omxhdr,vdec_msg->status_code, 876111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 876211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 876311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_EVT_INFO_FIELD_DROPPED: 876411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int64_t *timestamp; 876511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel timestamp = (int64_t *) malloc(sizeof(int64_t)); 876611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (timestamp) { 876711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *timestamp = vdec_msg->msgdata.output_frame.time_stamp; 876811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned long)timestamp, vdec_msg->status_code, 876911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED); 877011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Field dropped time stamp is %lld", 877111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (long long)vdec_msg->msgdata.output_frame.time_stamp); 877211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 877311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 877411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_OUTPUT_FLUSHED: 877511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE: 877611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 877711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data; 877811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr == NULL || omx->m_out_mem_ptr == NULL || 877911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr->index >= omx->drv_ctx.op_buf.actualcount) { 878011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr = NULL; 878111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->status_code = VDEC_S_EFATAL; 878211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 878311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 878411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane = v4l2_buf_ptr->m.planes; 878511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr = omx->m_out_mem_ptr + v4l2_buf_ptr->index; 878611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 878711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr && omxhdr->pOutputPortPrivate && 878811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((omxhdr - omx->m_out_mem_ptr) < (int)omx->drv_ctx.op_buf.actualcount) && 878911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate 879011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel - omx->drv_ctx.ptr_respbuffer) < (int)omx->drv_ctx.op_buf.actualcount)) { 879111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 879211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) { 879311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len; 879411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset; 879511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp; 879611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags = 0; 879711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 879811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) { 879911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_EOS; 880011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //rc = -1; 880111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 880211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr->nFilledLen) { 880311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME; 880411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 880511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) { 880611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME; 880711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 880811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME; 880911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 881011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) { 881111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 881211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 881311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) { 881411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY; 881511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 881611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_MSM_BUF_FLAG_MBAFF) { 881711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_MBAFF; 881811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 881911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_READONLY) { 882011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_READONLY; 882111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("F_B_D: READONLY BUFFER - REFERENCE WITH F/W fd = %d", 882211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd); 882311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 882411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 882511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) && 882611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !omx->output_flush_progress && 882711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) && 882811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS)) { 882911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = v4l2_buf_ptr->index; 883011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int extra_idx = EXTRADATA_IDX(omx->drv_ctx.num_planes); 883111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->time_stamp_dts.remove_time_stamp( 883211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nTimeStamp, 883311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (omx->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 883411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ?true:false); 883511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].bytesused = 0; 883611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = 883711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)omx->drv_ctx.ptr_outputbuffer[index].bufferaddr - 883811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)omx->drv_ctx.ptr_outputbuffer[index].offset; 883911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = omx->drv_ctx.ptr_outputbuffer[index].pmem_fd; 884011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[1] = omx->drv_ctx.ptr_outputbuffer[index].offset; 884111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = 0; 884211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr->flags = 0x0; 884311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 884411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].bytesused = 0; 884511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = omx->drv_ctx.extradata_info.buffer_size; 884611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = (long unsigned int) (omx->drv_ctx.extradata_info.uaddr + index * omx->drv_ctx.extradata_info.buffer_size); 884711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 884811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = omx->drv_ctx.extradata_info.ion.fd_ion_data.fd; 884911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 885011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[1] = v4l2_buf_ptr->index * omx->drv_ctx.extradata_info.buffer_size; 885111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].data_offset = 0; 885211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 885311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx); 885411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 885511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 885611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 885711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("SENDING FTB TO F/W from async_message_process - fd[0] = %d fd[1] = %d offset[1] = %d in_flush = %d", 885811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], omx->output_flush_progress); 885911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_QBUF, v4l2_buf_ptr)) { 886011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 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]); 886111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 886211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 886311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 886411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 886511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) { 886611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 886711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 886811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 886911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf = (struct vdec_output_frameinfo *)\ 887011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->pOutputPortPrivate; 887111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!output_respbuf) { 887211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("async_message_process: invalid output buf received"); 887311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 887411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 887511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf->len = vdec_msg->msgdata.output_frame.len; 887611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf->offset = vdec_msg->msgdata.output_frame.offset; 887711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 887811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) { 887911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf->pic_type = PICTURE_TYPE_I; 888011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 888111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) { 888211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf->pic_type = PICTURE_TYPE_P; 888311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 888411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) { 888511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf->pic_type = PICTURE_TYPE_B; 888611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 888711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 888811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (vdec_msg->msgdata.output_frame.len) { 888942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel if (!omx->output_flush_progress && (omxhdr->nFilledLen > 0)) { 889042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // set the default colorspace advised by client, since the bitstream may be 889142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // devoid of colorspace-info. 889242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel if (omx->m_enable_android_native_buffers) { 889342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel ColorSpace_t color_space = ITU_R_601; 889442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel 889542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // Disabled ? 889642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // WA for VP8. Vp8 encoder does not embed color-info (yet!). 889742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // Encoding RGBA results in 601-LR for all resolutions. 889842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // This conflicts with the client't defaults which are based on resolution. 889942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // Eg: 720p will be encoded as 601-LR. Client will say 709. 890042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // Re-enable this code once vp8 encoder generates color-info and hence the 890142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // decoder will be able to override with the correct source color. 890242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#if 0 890342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel switch (omx->m_client_color_space.sAspects.mPrimaries) { 890442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel case ColorAspects::PrimariesBT601_6_625: 890542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel case ColorAspects::PrimariesBT601_6_525: 890642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel { 890742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel color_space = omx->m_client_color_space.sAspects.mRange == ColorAspects::RangeFull ? 890842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel ITU_R_601_FR : ITU_R_601; 890942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel break; 891042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 891142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel case ColorAspects::PrimariesBT709_5: 891242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel { 891342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel color_space = ITU_R_709; 891442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel break; 891542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 891642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel default: 891742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel { 891842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel break; 891942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 892042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 892142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#endif 892242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel DEBUG_PRINT_LOW("setMetaData for Color Space (client) = 0x%x (601=%u FR=%u 709=%u)", 892342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel color_space, ITU_R_601, ITU_R_601_FR, ITU_R_709); 892442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel omx->set_colorspace_in_handle(color_space, omxhdr - omx->m_out_mem_ptr); 892542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 892642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 892742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel 892811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Processing extradata"); 892911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->handle_extradata(omxhdr); 893011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 893111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->m_extradata_info.output_crop_updated) { 893211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Read FBD crop from output extra data"); 893311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.left = omx->m_extradata_info.output_crop_rect.nLeft; 893411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.top = omx->m_extradata_info.output_crop_rect.nTop; 893511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.right = omx->m_extradata_info.output_crop_rect.nWidth; 893611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.bottom = omx->m_extradata_info.output_crop_rect.nHeight; 893711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_width = omx->m_extradata_info.output_width; 893811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_height = omx->m_extradata_info.output_height; 893911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 894011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Read FBD crop from v4l2 reserved fields"); 894111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.left = plane[0].reserved[2]; 894211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.top = plane[0].reserved[3]; 894311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.right = plane[0].reserved[2] + plane[0].reserved[4]; 894411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.bottom = plane[0].reserved[3] + plane[0].reserved[5]; 894511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_width = plane[0].reserved[6]; 894611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_height = plane[0].reserved[7]; 8947fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 8948fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel /* Copy these values back to OMX internal variables to make both handlign same*/ 8949fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 8950fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel omx->m_extradata_info.output_crop_rect.nLeft = vdec_msg->msgdata.output_frame.framesize.left; 8951fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel omx->m_extradata_info.output_crop_rect.nTop = vdec_msg->msgdata.output_frame.framesize.top; 8952fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel omx->m_extradata_info.output_crop_rect.nWidth = vdec_msg->msgdata.output_frame.framesize.right; 8953fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel omx->m_extradata_info.output_crop_rect.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom; 8954fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel omx->m_extradata_info.output_width = vdec_msg->msgdata.output_frame.picsize.frame_width; 8955fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel omx->m_extradata_info.output_height = vdec_msg->msgdata.output_frame.picsize.frame_height; 895611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 895711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 895811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 895911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.bufferaddr = 896011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr; 896111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8962fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (vdec_msg->msgdata.output_frame.len) 8963fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(&omx->drv_ctx.frame_size, 8964fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel &vdec_msg->msgdata.output_frame.framesize, 8965fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel sizeof(struct vdec_framesize)); 896611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8967fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("[RespBufDone] Fd(%d) Buf(%p) Ts(%lld) PicType(%u) Flags (0x%x)" 8968fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel " FillLen(%u) Crop: L(%u) T(%u) R(%u) B(%u)", 8969fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd, 897011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr, (long long)vdec_msg->msgdata.output_frame.time_stamp, 897111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.pic_type, v4l2_buf_ptr->flags, 897211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)vdec_msg->msgdata.output_frame.len, 897311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.left, 897411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.top, 897511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.right, 897611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.bottom); 897711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 897811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Post event if resolution OR crop changed */ 897911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* filled length will be changed if resolution changed */ 898011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Crop parameters can be changed even without resolution change */ 898111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr->nFilledLen 898211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && ((omx->prev_n_filled_len != omxhdr->nFilledLen) 898311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (omx->drv_ctx.frame_size.left != vdec_msg->msgdata.output_frame.framesize.left) 898411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (omx->drv_ctx.frame_size.top != vdec_msg->msgdata.output_frame.framesize.top) 898511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (omx->drv_ctx.frame_size.right != vdec_msg->msgdata.output_frame.framesize.right) 898611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (omx->drv_ctx.frame_size.bottom != vdec_msg->msgdata.output_frame.framesize.bottom) 898711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (omx->drv_ctx.video_resolution.frame_width != vdec_msg->msgdata.output_frame.picsize.frame_width) 898811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (omx->drv_ctx.video_resolution.frame_height != vdec_msg->msgdata.output_frame.picsize.frame_height) )) { 898911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 899011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Parameters 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", 899111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->prev_n_filled_len, 899211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.frame_width, 899311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.frame_height, 899411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.frame_size.left, omx->drv_ctx.frame_size.top, 899511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.frame_size.right, omx->drv_ctx.frame_size.bottom, 899611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFilledLen, vdec_msg->msgdata.output_frame.picsize.frame_width, 899711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_height, 899811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.left, 899911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.top, 900011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.right, 900111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.bottom); 900211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 900311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.frame_width = 900411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_width; 900511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.frame_height = 900611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_height; 900711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) { 900811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.stride = 900911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_Y_STRIDE(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_width); 901011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.scan_lines = 901111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_Y_SCANLINES(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_height); 901211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) { 901311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.stride = 901411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_width); 901511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.scan_lines = 901611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_height); 9017b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) { 9018b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel omx->drv_ctx.video_resolution.stride = 9019b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, omx->drv_ctx.video_resolution.frame_width); 9020b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel omx->drv_ctx.video_resolution.scan_lines = 9021b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, omx->drv_ctx.video_resolution.frame_height); 9022b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 902311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 902411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event(OMX_CORE_OUTPUT_PORT_INDEX, 902511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IndexConfigCommonOutputCrop, 902611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_PORT_RECONFIG); 902711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 902811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 902911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr->nFilledLen) 903011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->prev_n_filled_len = omxhdr->nFilledLen; 903111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 903211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr && omxhdr->nFilledLen && !omx->high_fps) { 903311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->request_perf_level(VIDC_NOMINAL); 903411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 903511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->output_use_buffer && omxhdr->pBuffer && 903611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.bufferaddr) 903711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy ( omxhdr->pBuffer, (void *) 903811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr + 903911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)vdec_msg->msgdata.output_frame.offset), 904011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.len); 904111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 904211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid filled length = %u, buffer size = %u, prev_length = %u", 904311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)vdec_msg->msgdata.output_frame.len, 904411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nAllocLen, omx->prev_n_filled_len); 904511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFilledLen = 0; 904611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 904711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 904811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned long)omxhdr, vdec_msg->status_code, 904911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_FBD); 905011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 905111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) { 905211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned long)NULL, vdec_msg->status_code, 905311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EOS_DONE); 905411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 905511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned int)NULL, vdec_msg->status_code, 905611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 905711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 905811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 905911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_EVT_CONFIG_CHANGED: 906011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Port settings changed"); 906111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->m_reconfig_width = vdec_msg->msgdata.output_frame.picsize.frame_width; 906211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->m_reconfig_height = vdec_msg->msgdata.output_frame.picsize.frame_height; 906311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition, 906411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_PORT_RECONFIG); 906511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx->high_fps) { 906611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->request_perf_level(VIDC_NOMINAL); 906711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 906811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 906911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 907011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 907111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 907211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 907311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 907411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 907511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary ( 907611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_HANDLETYPE hComp, 907711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *buffer 907811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 907911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 908011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned address,p2,id; 908111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Empty this arbitrary"); 908211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 908311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL) { 908411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 908511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 908611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 908711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %u, timestamp %lld", 908811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)buffer->nFilledLen, (unsigned int)buffer->nFlags, buffer->nTimeStamp); 908911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 909011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* return zero length and not an EOS buffer */ 909111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* return buffer if input flush in progress */ 909211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) && 909311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) { 909411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress"); 909511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone (hComp,m_app_data,buffer); 909611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 909711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 909811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 909911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame == NULL) { 910011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp); 910111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = buffer; 910211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Try to Push One Input Buffer "); 910311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel push_input_buffer (hComp); 910411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 910511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer); 910611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_input_pending_q.insert_entry((unsigned long)buffer, (unsigned)NULL, 910711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL)) { 910811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 910911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 911011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 911111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 911211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 911311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_config_flag = false; 911411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 911511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 911611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 911711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 911811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp) 911911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 912011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address,p2,id; 912111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 912211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 912311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame == NULL || psource_frame == NULL) { 912411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if we have a destination buffer*/ 912511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame == NULL) { 912611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Get a Destination buffer from the queue"); 912711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_free_q.m_size) { 912811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.pop_entry(&address,&p2,&id); 912911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = (OMX_BUFFERHEADERTYPE *)address; 913011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 913111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = LLONG_MAX; 913211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame); 913311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 913411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 913511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 913611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if we have a destination buffer*/ 913711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame == NULL) { 913811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Get a source buffer from the queue"); 913911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pending_q.m_size) { 914011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pending_q.pop_entry(&address,&p2,&id); 914111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = (OMX_BUFFERHEADERTYPE *)address; 914211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame, 914311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame->nTimeStamp); 914411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Next source Buffer flag %u length %u", 914511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen); 914611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 914711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 914811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 914911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 915011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 915111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 915211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while ((pdest_frame != NULL) && (psource_frame != NULL)) { 915311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (codec_type_parse) { 915411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case CODEC_TYPE_MPEG4: 915511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case CODEC_TYPE_H263: 915611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case CODEC_TYPE_MPEG2: 915711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = push_input_sc_codec(hComp); 915811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 915911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case CODEC_TYPE_H264: 916011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = push_input_h264(hComp); 916111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 916211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case CODEC_TYPE_HEVC: 916311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = push_input_hevc(hComp); 916411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 916511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case CODEC_TYPE_VC1: 916611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = push_input_vc1(hComp); 916711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 916811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 916911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 917011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 917111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret != OMX_ErrorNone) { 917211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Pushing input Buffer Failed"); 917311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 917411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 917511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 917611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 917711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 917811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 917911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 918011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 918111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp) 918211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 918311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 partial_frame = 1; 918411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL generate_ebd = OMX_TRUE; 918511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address = 0, p2 = 0, id = 0; 918611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 918711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %lld", 918811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame,psource_frame->nTimeStamp); 918911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.parse_sc_frame(psource_frame, 919011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame,&partial_frame) == -1) { 919111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 919211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 919311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 919411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 919511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (partial_frame == 0) { 919611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Frame size %u source %p frame count %d", 919711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen,psource_frame,frame_count); 919811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 919911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 920011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("TimeStamp updated %lld", pdest_frame->nTimeStamp); 920111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*First Parsed buffer will have only header Hence skip*/ 920211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frame_count == 0) { 920311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame "); 920411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 920511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_type_parse == CODEC_TYPE_MPEG4 || 920611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse == CODEC_TYPE_DIVX) { 920711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mp4StreamType psBits; 920811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset; 920911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psBits.numBytes = pdest_frame->nFilledLen; 921011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mp4_headerparser.parseHeader(&psBits); 921111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 921211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 921311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count++; 921411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 921511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 921611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame->nFilledLen) { 921711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Push the frame to the Decoder*/ 921811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 921911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 922011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 922111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count++; 922211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 922311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 922411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_free_q.m_size) { 922511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.pop_entry(&address,&p2,&id); 922611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 922711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 922811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 922911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) { 923011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Zero len buffer return back to POOL"); 923111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned)NULL, 923211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL); 923311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 923411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 923511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 923611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 923711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Not a Complete Frame %u", (unsigned int)pdest_frame->nFilledLen); 923811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if Destination Buffer is full*/ 923911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame->nAllocLen == 924011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen + pdest_frame->nOffset) { 924111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled"); 924211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorStreamCorrupt; 924311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 924411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 924511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 924611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFilledLen == 0) { 924711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 924811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) { 924911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags |= psource_frame->nFlags; 9250fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pdest_frame->nTimeStamp = psource_frame->nTimeStamp; 925111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %lld", 925211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 925311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Found a frame size = %u number = %d", 925411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen,frame_count++); 925511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Push the frame to the Decoder*/ 925611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 925711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 925811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 925911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count++; 926011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 926111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 926211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Last frame in else dest addr") ; 926311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel generate_ebd = OMX_FALSE; 926411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 926511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 926611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (generate_ebd) { 926711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame); 926811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 926911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 927011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 927111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pending_q.m_size) { 927211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame); 927311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pending_q.pop_entry(&address,&p2,&id); 927411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = (OMX_BUFFERHEADERTYPE *) address; 927511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame, 927611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame->nTimeStamp); 927711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Next source Buffer flag %u length %u", 927811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen); 927911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 928011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 928111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 928211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 928311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 928411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 928511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp) 928611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 928711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 partial_frame = 1; 928811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address = 0, p2 = 0, id = 0; 928911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL isNewFrame = OMX_FALSE; 929011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL generate_ebd = OMX_TRUE; 929111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 929211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.pBuffer == NULL) { 929311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated"); 929411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 929511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 929611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %u " 929711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "look_ahead_nal %d", (unsigned int)h264_scratch.nFilledLen, look_ahead_nal); 929811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %u",(unsigned int)pdest_frame->nFilledLen); 929911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.nFilledLen && look_ahead_nal) { 930011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = false; 930111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 930211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen) { 930311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 930411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer,h264_scratch.nFilledLen); 930511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen += h264_scratch.nFilledLen; 930611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame"); 930711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 930811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 930911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264"); 931011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 931111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 931211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 931311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 931411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* If an empty input is queued with EOS, do not coalesce with the destination-frame yet, as this may result 931511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel in EOS flag getting associated with the destination 931611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 931711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame->nFilledLen && (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) && 931811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen) { 931911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("delay ETB for 'empty buffer with EOS'"); 932011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel generate_ebd = OMX_FALSE; 932111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 932211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 932311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nal_length == 0) { 932411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Zero NAL, hence parse using start code"); 932511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.parse_sc_frame(psource_frame, 932611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &h264_scratch,&partial_frame) == -1) { 932711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 932811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 932911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 933011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 933111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length); 933211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.parse_h264_nallength(psource_frame, 933311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &h264_scratch,&partial_frame) == -1) { 933411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error"); 933511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 933611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 933711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 933811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 933911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (partial_frame == 0) { 934011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 934111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip"); 934211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count++; 934311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 934411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFlags = psource_frame->nFlags; 934511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 934611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Parsed New NAL Length = %u",(unsigned int)h264_scratch.nFilledLen); 934711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.nFilledLen) { 934811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen, 934911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NALU_TYPE_SPS); 935011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 935111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_TIMEINFO_EXTRADATA) 935211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 935311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen, NALU_TYPE_SEI); 935411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 935511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // If timeinfo is present frame info from SEI is already processed 935611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 935711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen, NALU_TYPE_SEI); 935811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 935911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame); 936011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count++; 936111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) { 936211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = h264_last_au_ts; 936311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = h264_last_au_flags; 936411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef PANSCAN_HDLR 936511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 936611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser->update_panscan_data(h264_last_au_ts); 936711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 936811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 936911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR || 937011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) { 937111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts = h264_scratch.nTimeStamp; 937211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_flags = h264_scratch.nFlags; 937311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 937411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 937511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts); 937611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!VALID_TS(h264_last_au_ts)) 937711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts = ts_in_sei; 937811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 937911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 938011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 938111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts = LLONG_MAX; 938211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 938311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 938411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!isNewFrame) { 938511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 938611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen) { 938711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %u", 938811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)h264_scratch.nFilledLen); 938911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 939011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer,h264_scratch.nFilledLen); 939111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen += h264_scratch.nFilledLen; 939211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ) 939311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 939411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 939511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 939611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264"); 939711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 939811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 939911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(h264_scratch.nFilledLen) { 940011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = true; 940111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %llu", 940211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 940311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Found a frame size = %u number = %d", 940411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen,frame_count++); 940511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 940611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame->nFilledLen == 0) { 940711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Copy the Current Frame since and push it"); 940811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = false; 940911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 941011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen) { 941111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 941211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer,h264_scratch.nFilledLen); 941311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen += h264_scratch.nFilledLen; 941411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 941511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 941611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264"); 941711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 941811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 941911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 942011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 942111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Reset the EOS Flag"); 942211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 942311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 942411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Push the frame to the Decoder*/ 942511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 942611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 942711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 942811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //frame_count++; 942911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 943011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_free_q.m_size) { 943111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.pop_entry(&address,&p2,&id); 943211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 943311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame); 943411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 943511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = 0; 943611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = LLONG_MAX; 943711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 943811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 943911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 944011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 944111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 944211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %u", (unsigned int)pdest_frame->nFilledLen); 944311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if Destination Buffer is full*/ 944411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.nAllocLen == 944511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen + h264_scratch.nOffset) { 944611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled"); 944711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorStreamCorrupt; 944811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 944911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 945011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 945111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame->nFilledLen) { 945211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame); 945311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 945411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 945511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) { 945611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer"); 945711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 945811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen) { 945911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(pdest_frame->nFilledLen == 0) { 946011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* No residual frame from before, send whatever 946111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * we have left */ 946211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy((pdest_frame->pBuffer + pdest_frame->nFilledLen), 946311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer, h264_scratch.nFilledLen); 946411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen += h264_scratch.nFilledLen; 946511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 946611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 946711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 946811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame); 946911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!isNewFrame) { 947011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Have a residual frame, but we know that the 947111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * AU in this frame is belonging to whatever 947211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * frame we had left over. So append it */ 947311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 947411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer,h264_scratch.nFilledLen); 947511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen += h264_scratch.nFilledLen; 947611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 947711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_last_au_ts != LLONG_MAX) 947811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = h264_last_au_ts; 947911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 948011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Completely new frame, let's just push what 948111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * we have now. The resulting EBD would trigger 948211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * another push */ 948311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel generate_ebd = OMX_FALSE; 948411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = h264_last_au_ts; 948511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts = h264_scratch.nTimeStamp; 948611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 948711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 948811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 948911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264"); 949011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 949111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 949211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 949311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Iff we coalesced two buffers, inherit the flags of both bufs */ 949411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(generate_ebd == OMX_TRUE) { 949511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 949611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 949711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 949811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%u TimeStamp = %llu", 949911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 950011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++); 950111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 950211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 950311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp); 950411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!VALID_TS(pdest_frame->nTimeStamp)) 950511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = ts_in_sei; 950611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 950711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 950811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Push the frame to the Decoder*/ 950911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 951011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 951111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 951211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count++; 951311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 951411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 951511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u", 951611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame, (unsigned int)h264_scratch.nFilledLen); 951711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel generate_ebd = OMX_FALSE; 951811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 951911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 952011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 952111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (generate_ebd && !psource_frame->nFilledLen) { 952211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 952311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 952411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pending_q.m_size) { 952511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame); 952611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pending_q.pop_entry(&address,&p2,&id); 952711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = (OMX_BUFFERHEADERTYPE *) address; 952811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Next source Buffer flag %u src length %u", 952911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen); 953011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 953111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 953211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 953311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 953411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 953511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc) 953611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 953711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE rc = OMX_ErrorNone; 953811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) { 953911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen); 954011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pDst->nTimeStamp == LLONG_MAX) { 954111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pDst->nTimeStamp = pSrc->nTimeStamp; 954211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Assign Dst nTimeStamp = %lld", pDst->nTimeStamp); 954311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 954411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pDst->nFilledLen += pSrc->nFilledLen; 954511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pSrc->nFilledLen = 0; 954611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 954711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Destination buffer overflow"); 954811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = OMX_ErrorBadParameter; 954911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 955011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 955111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 955211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 955311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_hevc(OMX_HANDLETYPE hComp) 955411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 955511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 partial_frame = 1; 955611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address,p2,id; 955711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL isNewFrame = OMX_FALSE; 955811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL generate_ebd = OMX_TRUE; 955911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE rc = OMX_ErrorNone; 956011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.pBuffer == NULL) { 956111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated"); 956211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 956311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 956411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 956511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("h264_scratch.nFilledLen %u has look_ahead_nal %d \ 956611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame nFilledLen %u nTimeStamp %lld", 956711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)h264_scratch.nFilledLen, look_ahead_nal, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 956811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 956911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.nFilledLen && look_ahead_nal) { 957011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = false; 957111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = copy_buffer(pdest_frame, &h264_scratch); 957211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc != OMX_ErrorNone) { 957311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 957411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 957511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 957611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 957711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nal_length == 0) { 957811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.parse_sc_frame(psource_frame, 957911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &h264_scratch,&partial_frame) == -1) { 958011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 958111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 958211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 958311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 958411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length); 958511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.parse_h264_nallength(psource_frame, 958611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &h264_scratch,&partial_frame) == -1) { 958711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error"); 958811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 958911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 959011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 959111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 959211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (partial_frame == 0) { 959311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 959411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip"); 959511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count++; 959611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 959711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFlags = psource_frame->nFlags; 959811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 959911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Parsed New NAL Length = %u", (unsigned int)h264_scratch.nFilledLen); 960011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.nFilledLen) { 960111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_hevc_utils.isNewFrame(&h264_scratch, 0, isNewFrame); 960211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count++; 960311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 960411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 960511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!isNewFrame) { 960611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %u \ 960711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nTimestamp %lld, pdest_frame nFilledLen %u nTimestamp %lld", 960811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp, 960911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 961011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = copy_buffer(pdest_frame, &h264_scratch); 961111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc != OMX_ErrorNone) { 961211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 961311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 961411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 961511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = true; 961611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame->nFilledLen == 0) { 961711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = false; 961811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer"); 961911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = copy_buffer(pdest_frame, &h264_scratch); 962011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc != OMX_ErrorNone) { 962111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 962211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 962311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 962411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 962511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 962611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 962711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FrameDetected # %d pdest_frame nFilledLen %u \ 962811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nTimeStamp %lld, look_ahead_nal in h264_scratch \ 962911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nFilledLen %u nTimeStamp %lld", 963011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count++, (unsigned int)pdest_frame->nFilledLen, 963111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp, (unsigned int)h264_scratch.nFilledLen, 963211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nTimeStamp); 963311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) { 963411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 963511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 963611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 963711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_free_q.m_size) { 963811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.pop_entry(&address, &p2, &id); 963911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 964011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("pop the next pdest_buffer %p", pdest_frame); 964111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 964211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = 0; 964311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = LLONG_MAX; 964411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 964511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 964611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 964711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 964811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 964911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %u nTimeStamp %lld, \ 965011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame nFilledLen %u nTimeStamp %lld, h264_scratch \ 965111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nFilledLen %u nTimeStamp %lld", 965211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp, 965311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp, 965411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp); 965511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 965611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.nAllocLen == 965711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen + h264_scratch.nOffset) { 965811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled"); 965911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorStreamCorrupt; 966011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 966111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 966211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 966311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame->nFilledLen) { 966411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client", psource_frame); 966511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 966611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) { 966711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer"); 966811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = copy_buffer(pdest_frame, &h264_scratch); 966911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( rc != OMX_ErrorNone ) { 967011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 967111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 967211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 967311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 967411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%u TimeStamp = %lld", 967511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 967611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) { 967711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 967811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 967911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count++; 968011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 968111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 968211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u", 968311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame, (unsigned int)h264_scratch.nFilledLen); 968411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel generate_ebd = OMX_FALSE; 968511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 968611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 968711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 968811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 968911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (generate_ebd && !psource_frame->nFilledLen) { 969011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone (hComp, m_app_data, psource_frame); 969111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 969211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pending_q.m_size) { 969311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pending_q.pop_entry(&address, &p2, &id); 969411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = (OMX_BUFFERHEADERTYPE *)address; 969511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Next source Buffer flag %u nFilledLen %u, nTimeStamp %lld", 969611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp); 969711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 969811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 969911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 970011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 970111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 970211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_vc1(OMX_HANDLETYPE hComp) 970311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 970411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *buf, *pdest; 970511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 partial_frame = 1; 970611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 buf_len, dest_len; 970711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 970811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (first_frame == 0) { 970911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel first_frame = 1; 971011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes"); 971111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_vendor_config.pData) { 971211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Check profile type in 1st source buffer"); 971311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf = psource_frame->pBuffer; 971411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_len = psource_frame->nFilledLen; 971511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 971611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) == 971711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VC1_SP_MP_START_CODE) { 971811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_vc1_profile = VC1_SP_MP_RCV; 971911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) { 972011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_vc1_profile = VC1_AP; 972111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 972211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer"); 972311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorStreamCorrupt; 972411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 972511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 972611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen + 972711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nOffset; 972811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen + 972911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nOffset); 973011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 973111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dest_len < m_vendor_config.nDataSize) { 973211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Destination buffer full"); 973311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 973411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 973511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize); 973611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen += m_vendor_config.nDataSize; 973711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 973811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 973911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 974011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 974111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (m_vc1_profile) { 974211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VC1_AP: 974311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code"); 974411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (push_input_sc_codec(hComp) != OMX_ErrorNone) { 974511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code"); 974611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 974711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 974811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 974911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 975011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VC1_SP_MP_RCV: 975111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 975211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode"); 975311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 975411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 975511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 975611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 975711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 975811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef USE_ION 975911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 976011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 alignment) 976111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 976211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem_allocation allocation; 976311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocation.size = buffer_size; 976411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocation.align = clip2(alignment); 976511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocation.align < 4096) { 976611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocation.align = 4096; 976711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 976811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) { 976911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)", 977011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocation.align, allocation.size); 977111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 977211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 977311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 977411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 977511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 977611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 977711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size, 977811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 alignment, struct ion_allocation_data *alloc_data, 977911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_fd_data *fd_data, int flag) 978011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 978111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fd = -EINVAL; 978211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = -EINVAL; 978311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ion_dev_flag; 978411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_ion ion_buf_info; 978511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!alloc_data || buffer_size <= 0 || !fd_data) { 978611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory"); 978711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -EINVAL; 978811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 978911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_dev_flag = O_RDONLY; 979011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = open (MEM_DEVICE, ion_dev_flag); 979111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 979211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd); 979311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return fd; 979411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 979511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 979611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->flags = flag; 979711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->len = buffer_size; 979811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->align = clip2(alignment); 979911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (alloc_data->align < 4096) { 980011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->align = 4096; 980111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 980211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 980311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID); 980411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode && (alloc_data->flags & ION_SECURE)) { 980511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID); 980611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 980711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 980811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Use secure display cma heap for obvious reasons. */ 980911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (alloc_data->flags & ION_FLAG_CP_BITSTREAM) { 981011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->heap_id_mask |= ION_HEAP(ION_SECURE_DISPLAY_HEAP_ID); 981111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 981211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 981311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd,ION_IOC_ALLOC,alloc_data); 981411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc || !alloc_data->handle) { 981511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION ALLOC memory failed"); 981611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->handle = 0; 981711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(fd); 981811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = -ENOMEM; 981911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return fd; 982011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 982111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd_data->handle = alloc_data->handle; 982211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd,ION_IOC_MAP,fd_data); 982311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 982411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION MAP failed "); 982511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_buf_info.ion_alloc_data = *alloc_data; 982611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_buf_info.ion_device_fd = fd; 982711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_buf_info.fd_ion_data = *fd_data; 982811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&ion_buf_info); 982911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd_data->fd =-1; 983011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = -ENOMEM; 983111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 983211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 983311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return fd; 983411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 983511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 983611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) 983711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 983811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 983911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!buf_ion_info) { 984011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata"); 984111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 984211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 984311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE, 984411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &buf_ion_info->ion_alloc_data.handle)) { 984511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION: free failed" ); 984611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 984711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(buf_ion_info->ion_device_fd); 984811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info->ion_device_fd = -1; 984911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info->ion_alloc_data.handle = 0; 985011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info->fd_ion_data.fd = -1; 985111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 985211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 985311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_output_buffer_header() 985411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 985511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ALL output buffers are freed/released"); 985611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_use_buffer = false; 985711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ouput_egl_buffers = false; 985811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 985911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 986011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_out_mem_ptr); 986111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = NULL; 986211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 986311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 986411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_platform_list) { 986511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_platform_list); 986611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list = NULL; 986711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 986811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 986911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_respbuffer) { 987011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (drv_ctx.ptr_respbuffer); 987111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = NULL; 987211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 987311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer) { 987411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (drv_ctx.ptr_outputbuffer); 987511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = NULL; 987611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 987711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 987811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.op_buf_ion_info) { 987911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free o/p ion context"); 988011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.op_buf_ion_info); 988111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = NULL; 988211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 988311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 988411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ref_remove(); 988511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 988611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 988711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_input_buffer_header() 988811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 988911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer = false; 989011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 989111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_heap_ptr) { 989211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free input Heap Pointer"); 989311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_inp_heap_ptr); 989411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr = NULL; 989511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 989611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 989711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_phdr_pmem_ptr) { 989811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free input pmem header Pointer"); 989911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_phdr_pmem_ptr); 990011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr = NULL; 990111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 990211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 990311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr) { 990411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free input pmem Pointer area"); 990511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_inp_mem_ptr); 990611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr = NULL; 990711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 990811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* We just freed all the buffer headers, every thing in m_input_free_q, 990911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * m_input_pending_q, pdest_frame, and psource_frame is now invalid */ 991011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_input_free_q.m_size) { 991111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address, p2, id; 991211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.pop_entry(&address, &p2, &id); 991311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 991411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_input_pending_q.m_size) { 991511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address, p2, id; 991611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pending_q.pop_entry(&address, &p2, &id); 991711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 991811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 991911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 992011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_inputbuffer) { 992111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Driver Context pointer"); 992211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (drv_ctx.ptr_inputbuffer); 992311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer = NULL; 992411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 992511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 992611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ip_buf_ion_info) { 992711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free ion context"); 992811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ip_buf_ion_info); 992911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf_ion_info = NULL; 993011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 993111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 993211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 993311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 993411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::stream_off(OMX_U32 port) 993511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 993611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type btype; 993711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 993811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_ports v4l2_port = OUTPUT_PORT; 993911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 994011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX) { 994111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 994211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_port = OUTPUT_PORT; 994311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 994411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 994511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_port = CAPTURE_PORT; 994611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == OMX_ALL) { 994711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX); 994811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 994911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 995011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!rc_input) 995111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc_input; 995211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 995311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc_output; 995411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 995511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 995611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!streaming[v4l2_port]) { 995711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // already streamed off, warn and move on 995811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port," 995911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " which is already streamed off", v4l2_port); 996011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 996111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 996211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 996311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port); 996411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 996511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype); 996611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 996711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 996811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port); 996911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 997011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[v4l2_port] = false; 997111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 997211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 997311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 997411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 997511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 997611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop) 997711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 997811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 997911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 998011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int buf_size = 0, extra_data_size = 0, default_extra_data_size = 0; 998111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int final_extra_data_size = 0; 998211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 998311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret = 0; 998411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)", 998511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size); 998611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 998711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 1; 998811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 998911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 999011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 999111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 999211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 999311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 999411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 999511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 999611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 999711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 999811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 999911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet==OMX_ErrorNone) { 1000011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 1000111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1000211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1000311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 1000411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 1000511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1000611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1000711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1000811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool is_res_1080p_or_below = (drv_ctx.video_resolution.frame_width <= 1920 && 1000911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height <= 1088) || 1001011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.video_resolution.frame_height <= 1088 && 1001111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width <= 1920); 1001211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1001311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fps = drv_ctx.frame_rate.fps_numerator / (float)drv_ctx.frame_rate.fps_denominator; 1001411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool fps_above_180 = (fps >= 180 || operating_frame_rate >= 180) ? true : false; 1001511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool increase_output = (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) && (bufreq.count >= 16); 1001611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1001711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (increase_output && fps_above_180 && 1001811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability == V4L2_PIX_FMT_H264 && 1001911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_res_1080p_or_below) { 1002011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel high_fps = true; 1002111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("High fps - fps = %d operating_rate = %d", fps, operating_frame_rate); 1002211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("getbufreq[output]: Increase buffer count (%d) to (%d) to support high fps", 1002311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count, bufreq.count + 10); 1002411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count += 10; 1002511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 1002611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1002711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("(Failed to set updated buffer count to driver"); 1002811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1002911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1003011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1003111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("new buf count = %d set to driver", bufreq.count); 1003211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel request_perf_level(VIDC_TURBO); 1003311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1003411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1003511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount = bufreq.count; 1003611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->mincount = bufreq.count; 1003711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Count = %d",bufreq.count); 1003811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1003911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)", 1004011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size); 1004111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1004211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 1004311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1004411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) 1004511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes; 1004611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Buffer Size = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage); 1004711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1004811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1004911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 1005011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 1005111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1005211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1005311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 1005411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1005511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = is_video_session_supported(); 1005611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet) 1005711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1005811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1005911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 1006011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = buffer_prop->buffer_size; 1006111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 1006211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 1006311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage; 1006411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 1006511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 1006611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1006711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1006811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1006911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default_extra_data_size = VENUS_EXTRADATA_SIZE( 1007011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height, 1007111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width); 1007211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel final_extra_data_size = extra_data_size > default_extra_data_size ? 1007311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_data_size : default_extra_data_size; 1007411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1007511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel final_extra_data_size = (final_extra_data_size + buffer_prop->alignment - 1) & 1007611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (~(buffer_prop->alignment - 1)); 1007711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1007811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.size = buffer_prop->actualcount * final_extra_data_size; 1007911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.count = buffer_prop->actualcount; 1008011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.buffer_size = final_extra_data_size; 1008111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 1008211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%u) BufSize(%d)", 1008311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size, buf_size); 1008411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_data_size) 1008511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq UPDATE: extradata: TotalSize(%d) BufferSize(%lu)", 1008611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.size, drv_ctx.extradata_info.buffer_size); 1008711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1008811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (in_reconfig) // BufReq will be set to driver when port is disabled 1008911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size = buf_size; 1009011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (buf_size != buffer_prop->buffer_size) { 1009111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size = buf_size; 1009211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_buffer_req(buffer_prop); 1009311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1009411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1009511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%u)", 1009611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size); 1009711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1009811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1009911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1010011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop) 1010111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1010211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1010311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned buf_size = 0; 101042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel struct v4l2_format fmt, c_fmt; 1010511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 101062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel int ret = 0; 1010711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%u)", 1010811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size); 1010911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 1011011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_size != buffer_prop->buffer_size) { 1011111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%u) Required(%d)", 1011211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)buffer_prop->buffer_size, buf_size); 1011311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 1011411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1011511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 101162601808ee2992a94c325d05e4065aba60b01840bThierry Strudel memset(&c_fmt, 0x0, sizeof(struct v4l2_format)); 1011711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 1011811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 1011911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size; 1012011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1012111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 1012211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1012311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 101242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 1012511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 101262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel c_fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 101272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel c_fmt.fmt.pix_mp.pixelformat = capture_capability; 101282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &c_fmt); 101292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel c_fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size; 101302601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &c_fmt); 1013111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1013211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 1013311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1013411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1013511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1013611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 1013711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret); 1013811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1013911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1014011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1014111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 1014211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = buffer_prop->actualcount; 1014311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 1014411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1014511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 1014611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1014711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1014811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 1014911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1015011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1015111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet==OMX_ErrorNone) { 1015211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 1015311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1015411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1015511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1015611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret); 1015711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 1015811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1015911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (bufreq.count < buffer_prop->actualcount) { 1016011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Driver refused to change the number of buffers" 1016111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " on v4l2 port %d to %d (prefers %d)", bufreq.type, 1016211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, bufreq.count); 1016311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1016411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1016511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_buffers.update_buffer_req()) { 1016611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed"); 1016711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1016811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1016911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1017011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1017111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1017211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1017311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1017411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::update_picture_resolution() 1017511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1017611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1017711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1017811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1017911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1018011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn) 1018111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1018211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1018311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 1018411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!portDefn) { 1018511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1018611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1018711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdec::update_portdef"); 1018811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nVersion.nVersion = OMX_SPEC_VERSION; 1018911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 1019011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->eDomain = OMX_PortDomainVideo; 1019111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 1019211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == portDefn->nPortIndex) { 1019311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->eDir = OMX_DirInput; 1019411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount; 1019511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount; 1019611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size; 1019711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused; 1019811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.eCompressionFormat = eCompressionFormat; 10199fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel //for input port, always report the fps value set by client, 10200fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel //to distinguish whether client got valid fps from parser. 10201fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel portDefn->format.video.xFramerate = m_fps_received; 1020211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->bEnabled = m_inp_bEnabled; 1020311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->bPopulated = m_inp_bPopulated; 1020411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1020511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1020611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 102072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 1020811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (1 == portDefn->nPortIndex) { 1020911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int buf_size = 0; 1021011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret = 0; 102112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (!is_down_scalar_enabled) { 102122601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 102132601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 102142601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 102152601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 102162601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 102172601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 102182601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 1021911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1022011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 1022111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 1022211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1022311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Resolution failed"); 1022411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 1022511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1022611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 1022711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_buffers.update_buffer_req()) { 1022811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed"); 1022911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 1023011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1023111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1023211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_buffers.get_buffer_req(buf_size)) { 1023311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("update buffer requirements"); 1023411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 1023511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1023611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferSize = buf_size; 1023711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->eDir = OMX_DirOutput; 1023811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount; 1023911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountMin = drv_ctx.op_buf.mincount; 1024011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 10241fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (drv_ctx.frame_rate.fps_denominator > 0) 10242fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel portDefn->format.video.xFramerate = (drv_ctx.frame_rate.fps_numerator / 10243fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel drv_ctx.frame_rate.fps_denominator) << 16; //Q16 format 10244fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel else { 10245fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_ERROR("Error: Divide by zero"); 10246fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return OMX_ErrorBadParameter; 10247fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 1024811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->bEnabled = m_out_bEnabled; 1024911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->bPopulated = m_out_bPopulated; 1025011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) { 1025111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error in getting color format"); 1025211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 1025311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1025411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1025511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 1025611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1025711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->eDir = OMX_DirMax; 1025811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d", 1025911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->nPortIndex); 1026011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 1026111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 102622601808ee2992a94c325d05e4065aba60b01840bThierry Strudel update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, 102632601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.plane_fmt[0].bytesperline, fmt.fmt.pix_mp.plane_fmt[0].reserved[0]); 102642601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 1026511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameHeight = drv_ctx.video_resolution.frame_height; 1026611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth = drv_ctx.video_resolution.frame_width; 1026711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nStride = drv_ctx.video_resolution.stride; 1026811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines; 1026911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1027011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420Planar) || 1027111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)) { 1027211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nStride = ALIGN(drv_ctx.video_resolution.frame_width, 16); 1027311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.frame_height; 1027411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1027511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("update_portdef(%u): Width = %u Height = %u Stride = %d " 1027611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "SliceHeight = %u eColorFormat = %d nBufSize %u nBufCnt %u", 1027711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nPortIndex, 1027811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameWidth, 1027911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameHeight, 1028011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->format.video.nStride, 1028111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nSliceHeight, 1028211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.eColorFormat, 1028311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nBufferSize, 1028411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nBufferCountActual); 1028511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1028611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1028711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1028811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1028911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_output_headers() 1029011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1029111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1029211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufHdr = NULL; 1029311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i= 0; 1029411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1029511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_out_mem_ptr) { 1029611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation"); 1029711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nBufHdrSize = 0; 1029811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPlatformEntrySize = 0; 1029911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPlatformListSize = 0; 1030011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPMEMInfoSize = 0; 1030111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 1030211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 1030311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 1030411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1030511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Setting First Output Buffer(%d)", 1030611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 1030711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufHdrSize = drv_ctx.op_buf.actualcount * 1030811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_BUFFERHEADERTYPE); 1030911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1031011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPMEMInfoSize = drv_ctx.op_buf.actualcount * 1031111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 1031211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPlatformListSize = drv_ctx.op_buf.actualcount * 1031311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 1031411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPlatformEntrySize = drv_ctx.op_buf.actualcount * 1031511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 1031611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1031711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize, 1031811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)sizeof(OMX_BUFFERHEADERTYPE), 1031911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPMEMInfoSize, 1032011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPlatformListSize); 1032111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("PE %d bmSize % " PRId64 , nPlatformEntrySize, 1032211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count); 1032311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 1032411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Alloc mem for platform specific info 1032511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char *pPtr=NULL; 1032611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 1032711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPMEMInfoSize,1); 1032811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \ 1032911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct vdec_bufferpayload), 1033011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 1033111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 1033211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof (struct vdec_output_frameinfo), 1033311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 1033411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) { 1033511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer"); 1033611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1033711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1033811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1033911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 1034011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \ 1034111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount); 1034211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.op_buf_ion_info) { 1034311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info"); 1034411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1034511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1034611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1034711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dynamic_buf_mode) { 1034811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list = (struct dynamic_buf_list *) \ 1034911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct dynamic_buf_list), drv_ctx.op_buf.actualcount); 1035011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (out_dynamic_list) { 1035111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (unsigned int i = 0; i < drv_ctx.op_buf.actualcount; i++) 1035211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].dup_fd = -1; 1035311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1035411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1035511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1035611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 1035711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && drv_ctx.ptr_respbuffer) { 1035811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr = m_out_mem_ptr; 1035911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 1036011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 1036111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((char *) m_platform_list) + nPlatformListSize); 1036211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 1036311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((char *) m_platform_entry) + nPlatformEntrySize); 1036411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList = m_platform_list; 1036511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry = m_platform_entry; 1036611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo = m_pmem_info; 1036711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1036811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 1036911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1037011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Settting the entire storage nicely 1037111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, 1037211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr,pPlatformEntry); 1037311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo); 1037411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 1037511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 1037611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 1037711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Set the values when we determine the right HxW param 1037811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nAllocLen = 0; 1037911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nFilledLen = 0; 1038011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pAppPrivate = NULL; 1038111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1038211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 1038311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry->entry = pPMEMInfo; 1038411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Initialize the Platform List 1038511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList->nEntries = 1; 1038611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList->entryList = pPlatformEntry; 1038711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Keep pBuffer NULL till vdec is opened 1038811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pBuffer = NULL; 1038911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo->offset = 0; 1039011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo->pmem_fd = -1; 1039111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pPlatformPrivate = pPlatformList; 1039211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = -1; 1039311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 1039411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].ion_device_fd =-1; 1039511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1039611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Create a mapping between buffers*/ 1039711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 1039811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer[i].client_data = (void *) \ 1039911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.ptr_outputbuffer[i]; 1040011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Move the buffer and buffer header pointers 1040111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr++; 1040211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo++; 1040311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry++; 1040411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList++; 1040511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1040611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1040711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\ 1040811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr, pPtr); 1040911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 1041011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_out_mem_ptr); 1041111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = NULL; 1041211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1041311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pPtr) { 1041411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(pPtr); 1041511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPtr = NULL; 1041611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1041711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer) { 1041811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ptr_outputbuffer); 1041911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = NULL; 1042011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1042111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_respbuffer) { 1042211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ptr_respbuffer); 1042311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = NULL; 1042411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1042511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 1042611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.op_buf_ion_info) { 1042711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free o/p ion context"); 1042811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.op_buf_ion_info); 1042911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = NULL; 1043011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1043111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1043211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1043311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1043411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1043511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1043611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1043711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1043811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1043911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1044011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::complete_pending_buffer_done_cbs() 1044111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1044211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1, p2, ident; 1044311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_cmd_queue tmp_q, pending_bd_q; 1044411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 1044511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // pop all pending GENERATE FDB from ftb queue 1044611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_ftb_q.m_size) { 1044711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.pop_entry(&p1,&p2,&ident); 1044811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_FBD) { 1044911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_bd_q.insert_entry(p1,p2,ident); 1045011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1045111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.insert_entry(p1,p2,ident); 1045211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1045311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1045411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //return all non GENERATE FDB to ftb queue 1045511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (tmp_q.m_size) { 1045611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.pop_entry(&p1,&p2,&ident); 1045711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.insert_entry(p1,p2,ident); 1045811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1045911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // pop all pending GENERATE EDB from etb queue 1046011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_etb_q.m_size) { 1046111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.pop_entry(&p1,&p2,&ident); 1046211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_EBD) { 1046311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_bd_q.insert_entry(p1,p2,ident); 1046411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1046511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.insert_entry(p1,p2,ident); 1046611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1046711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1046811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //return all non GENERATE FDB to etb queue 1046911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (tmp_q.m_size) { 1047011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.pop_entry(&p1,&p2,&ident); 1047111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.insert_entry(p1,p2,ident); 1047211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1047311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 1047411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // process all pending buffer dones 1047511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (pending_bd_q.m_size) { 1047611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_bd_q.pop_entry(&p1,&p2,&ident); 1047711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (ident) { 1047811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EBD: 1047911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 1048011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!"); 1048111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 1048211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1048311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1048411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1048511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_FBD: 1048611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 1048711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!"); 1048811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 1048911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1049011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1049111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1049211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1049311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1049411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1049511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp) 1049611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1049711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 new_frame_interval = 0; 1049811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts 1049911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && llabs(act_timestamp - prev_ts) > 2000) { 1050011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_frame_interval = client_set_fps ? frm_int : (act_timestamp - prev_ts) > 0 ? 1050111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel llabs(act_timestamp - prev_ts) : llabs(act_timestamp - prev_ts_actual); 1050211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (new_frame_interval != frm_int || frm_int == 0) { 1050311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int = new_frame_interval; 1050411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frm_int) { 1050511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = 1e6; 1050611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator = frm_int; 1050711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)", 1050811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator / 1050911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (float)drv_ctx.frame_rate.fps_denominator); 1051011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_control.request_cores(frm_int); 1051111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* We need to report the difference between this FBD and the previous FBD 1051211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * back to the driver for clock scaling purposes. */ 1051311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_outputparm oparm; 1051411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*XXX: we're providing timing info as seconds per frame rather than frames 1051511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * per second.*/ 1051611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 1051711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 1051811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1051911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_streamparm sparm; 1052011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1052111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.parm.output = oparm; 1052211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) { 1052311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \ 1052411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel performance might be affected"); 1052511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1052611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1052711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1052811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1052911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1053011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = act_timestamp; 1053111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1053211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1053311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp) 1053411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1053511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rst_prev_ts && VALID_TS(act_timestamp)) { 1053611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = act_timestamp; 1053711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts_actual = act_timestamp; 1053811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = false; 1053911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (VALID_TS(prev_ts)) { 1054011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool codec_cond = (drv_ctx.timestamp_adjust)? 1054111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!VALID_TS(act_timestamp) || act_timestamp < prev_ts_actual || llabs(act_timestamp - prev_ts_actual) <= 2000) : 1054211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!VALID_TS(act_timestamp) || act_timestamp <= prev_ts_actual); 1054311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts_actual = act_timestamp; //unadjusted previous timestamp 1054411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frm_int > 0 && codec_cond) { 1054511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp); 1054611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel act_timestamp = prev_ts + frm_int; 1054711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp); 1054811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = act_timestamp; 1054911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1055011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.picture_order == VDEC_ORDER_DISPLAY && act_timestamp < prev_ts) { 1055111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // ensure that timestamps can never step backwards when in display order 1055211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel act_timestamp = prev_ts; 1055311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1055411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel set_frame_rate(act_timestamp); 1055511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1055611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (frm_int > 0) // In this case the frame rate was set along 1055711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { // with the port definition, start ts with 0 1055811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel act_timestamp = prev_ts = 0; // and correct if a valid ts is received. 1055911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = true; 1056011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1056111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1056211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1056311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_BUFFERHEADERTYPE* omx_vdec::get_omx_output_buffer_header(int index) 1056411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1056511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return m_out_mem_ptr + index; 1056611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1056711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 10568fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::convert_color_space_info(OMX_U32 primaries, OMX_U32 range, 10569fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space, ColorAspects *aspects) 10570fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 10571fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch (primaries) { 10572fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_BT709_5: 10573fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel *color_space = ITU_R_709; 10574fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT709_5; 10575fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10576fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_BT470_6_M: 10577fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT470_6M; 10578fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10579fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_BT601_6_625: 10580fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625; 10581fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10582fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_BT601_6_525: 10583fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel *color_space = range ? ITU_R_601_FR : ITU_R_601; 10584fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT601_6_525; 10585fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10586fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_GENERIC_FILM: 10587fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesGenericFilm; 10588fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10589fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_BT2020: 10590fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT2020; 10591fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10592fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_UNSPECIFIED: 10593fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel //Client does not expect ColorAspects::PrimariesUnspecified, but rather the supplied default 10594fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 10595fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel //aspects->mPrimaries = ColorAspects::PrimariesOther; 10596fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries; 10597fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10598fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10599fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10600fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = range ? ColorAspects::RangeFull : ColorAspects::RangeLimited; 10601fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10602fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch (transfer) { 10603fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_BT709_5: 10604fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_601_6_525: // case MSM_VIDC_TRANSFER_601_6_625: 10605fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10606fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10607fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_BT_470_6_M: 10608fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferGamma22; 10609fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10610fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_BT_470_6_BG: 10611fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferGamma28; 10612fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10613fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_SMPTE_240M: 10614fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE240M; 10615fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10616fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_LINEAR: 10617fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferLinear; 10618fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10619fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_IEC_61966: 10620fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferXvYCC; 10621fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10622fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_BT_1361: 10623fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferBT1361; 10624fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10625fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_SRGB: 10626fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSRGB; 10627fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10628fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 10629fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel //aspects->mTransfer = ColorAspects::TransferOther; 10630fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = m_client_color_space.sAspects.mTransfer; 10631fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10632fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10633fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10634fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch (matrix) { 10635fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_BT_709_5: 10636fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5; 10637fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10638fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_FCC_47: 10639fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT470_6M; 10640fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10641fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_601_6_625: 10642fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_601_6_525: 10643fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6; 10644fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10645fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_SMPTE_240M: 10646fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixSMPTE240M; 10647fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10648fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_BT_2020: 10649fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020; 10650fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10651fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_BT_2020_CONST: 10652fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020Constant; 10653fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10654fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 10655fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel //aspects->mMatrixCoeffs = ColorAspects::MatrixOther; 10656fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs; 10657fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10658fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10659fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 10660fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10661fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::print_debug_color_aspects(ColorAspects *aspects, const char *prefix) { 10662fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("%s : Color aspects : Primaries = %d Range = %d Transfer = %d MatrixCoeffs = %d", 10663fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel prefix, aspects->mPrimaries, aspects->mRange, aspects->mTransfer, aspects->mMatrixCoeffs); 10664fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 10665fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10666fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelbool omx_vdec::handle_color_space_info(void *data, unsigned int buf_index) 10667fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 10668fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel ColorSpace_t color_space = ITU_R_601; 10669fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel ColorAspects tempAspects; 10670fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset(&tempAspects, 0x0, sizeof(ColorAspects)); 10671fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel ColorAspects *aspects = &tempAspects; 10672fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10673fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch(output_capability) { 10674fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_MPEG2: 10675fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 10676fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload; 10677fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data; 10678fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10679fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* Refer MPEG2 Spec @ Rec. ISO/IEC 13818-2, ITU-T Draft Rec. H.262 to 10680fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * understand this code */ 10681fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10682fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (seqdisp_payload && seqdisp_payload->color_descp) { 10683fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10684fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel convert_color_space_info(seqdisp_payload->color_primaries, 1, 10685fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel seqdisp_payload->transfer_char, seqdisp_payload->matrix_coeffs, 10686fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel &color_space,aspects); 10687fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_disp_hor_size = seqdisp_payload->disp_width; 10688fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_disp_vert_size = seqdisp_payload->disp_height; 10689fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10690fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10691fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10692fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_H264: 10693fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_HEVC: 10694fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 10695fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct msm_vidc_vui_display_info_payload *display_info_payload; 10696fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel display_info_payload = (struct msm_vidc_vui_display_info_payload*)data; 10697fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10698fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* Refer H264 Spec @ Rec. ITU-T H.264 (02/2014) to understand this code */ 10699fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10700fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (display_info_payload->video_signal_present_flag && 10701fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel display_info_payload->color_description_present_flag) { 10702fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel convert_color_space_info(display_info_payload->color_primaries, 10703fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel display_info_payload->video_full_range_flag, 10704fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel display_info_payload->transfer_characteristics, 10705fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel display_info_payload->matrix_coefficients, 10706fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel &color_space,aspects); 10707fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10708fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10709fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10710fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VC1_ANNEX_G: 10711fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VC1_ANNEX_L: 10712fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 10713fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct msm_vidc_vc1_seqdisp_payload *vc1_seq_disp_payload; 10714fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vc1_seq_disp_payload = (struct msm_vidc_vc1_seqdisp_payload*)data; 10715fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10716fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* Refer VC-1 Spec @ SMPTE Draft Standard for Television Date: 2005-08-23 10717fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * SMPTE 421M to understand this code */ 10718fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10719fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_enable_android_native_buffers && 10720fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vc1_seq_disp_payload->color_primaries) { 10721fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10722fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel convert_color_space_info(vc1_seq_disp_payload->color_primaries, 10723fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 1, 10724fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vc1_seq_disp_payload->transfer_char, 10725fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vc1_seq_disp_payload->matrix_coeffs, 10726fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel &color_space,aspects); 10727fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10728fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10729fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10730fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VP8: 10731fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 10732fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload; 10733fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data; 10734fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10735fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* Refer VP8 Data Format in latest VP8 spec and Decoding Guide November 2011 10736fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * to understand this code */ 10737fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10738fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (vpx_color_space_payload->color_space == 0) { 10739fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = ITU_R_601; 10740fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 10741fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Unsupported Color space for VP8"); 10742fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10743fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10744fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10745fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10746fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VP9: 10747fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 10748fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload; 10749fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data; 10750fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10751fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* Refer VP9 Spec @ VP9 Bitstream & Decoding Process Specification - v0.6 31st March 2016 10752fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * to understand this code */ 10753fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10754fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch(vpx_color_space_payload->color_space) { 10755fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_BT_601: 10756fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6; 10757fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10758fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625; 10759fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10760fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10761fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_BT_709: 10762fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = ITU_R_709; 10763fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5; 10764fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10765fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT709_5; 10766fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10767fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10768fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_SMPTE_170: 10769fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5; 10770fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10771fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries; 10772fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10773fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10774fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_SMPTE_240: 10775fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs; 10776fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE240M; 10777fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries; 10778fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10779fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10780fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_BT_2020: 10781fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020; 10782fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects:: TransferSMPTE170M; 10783fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT2020; 10784fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10785fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10786fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_RESERVED: 10787fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixOther; 10788fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferOther; 10789fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesOther; 10790fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10791fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10792fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_RGB: 10793fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5; 10794fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10795fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesOther; 10796fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10797fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10798fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 10799fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10800fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10801fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10802fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10803fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 10804fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10805fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10806fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_enable_android_native_buffers) { 10807fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 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); 10808fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel set_colorspace_in_handle(color_space, buf_index); 10809fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10810fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(aspects, "Bitstream"); 10811fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10812fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_internal_color_space.sAspects.mPrimaries != aspects->mPrimaries || 10813fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mTransfer != aspects->mTransfer || 10814fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mMatrixCoeffs != aspects->mMatrixCoeffs || 10815fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mRange != aspects->mRange) { 10816fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(&(m_internal_color_space.sAspects), aspects, sizeof(ColorAspects)); 10817fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.bDataSpaceChanged = OMX_TRUE; 10818fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10819fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_HIGH("Initiating PORT Reconfig due to Color Aspects Change"); 10820fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(m_internal_color_space.sAspects), "Internal"); 10821fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(m_client_color_space.sAspects), "Client"); 10822fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10823fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel post_event(OMX_CORE_OUTPUT_PORT_INDEX, 10824fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_QTIIndexConfigDescribeColorAspects, 10825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_COMPONENT_GENERATE_PORT_RECONFIG); 10826fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return true; 10827fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10828fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return false; 10829fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 10830fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10831fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::set_colorspace_in_handle(ColorSpace_t color_space, unsigned int buf_index) { 10832fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel private_handle_t *private_handle = NULL; 10833fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (buf_index < drv_ctx.op_buf.actualcount && 10834fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS && 10835fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel native_buffer[buf_index].privatehandle) { 10836fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel private_handle = native_buffer[buf_index].privatehandle; 10837fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10838fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (private_handle) { 10839fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel setMetaData(private_handle, UPDATE_COLOR_SPACE, (void*)&color_space); 10840fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10841fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 10842fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10843fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelvoid omx_vdec::print_debug_hdr_color_info(HDRStaticInfo *hdr_info, const char *prefix) 10844fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{ 10845fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (!hdr_info->mID) { 10846fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mR.x = %d mR.y = %d", prefix, 10847fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mR.x, hdr_info->sType1.mR.y); 10848fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mG.x = %d mG.y = %d", prefix, 10849fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mG.x, hdr_info->sType1.mG.y); 10850fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mB.x = %d mB.y = %d", prefix, 10851fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mB.x, hdr_info->sType1.mB.y); 10852fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mW.x = %d mW.y = %d", prefix, 10853fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mW.x, hdr_info->sType1.mW.y); 10854fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: maxDispLum = %d minDispLum = %d", prefix, 10855fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mMaxDisplayLuminance, hdr_info->sType1.mMinDisplayLuminance); 10856fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("%s : HDRstaticinfo CLL: CLL = %d FLL = %d", prefix, 10857fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mMaxContentLightLevel, hdr_info->sType1.mMaxFrameAverageLightLevel); 10858fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 10859fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10860fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel} 10861fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10862fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10863fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10864fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelbool omx_vdec::handle_content_light_level_info(void* data) 10865fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{ 10866fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel struct msm_vidc_content_light_level_sei_payload *light_level_payload = 10867fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (msm_vidc_content_light_level_sei_payload*)(data); 10868fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10869fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if ((m_internal_hdr_info.sInfo.sType1.mMaxContentLightLevel != light_level_payload->nMaxContentLight) || 10870fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (m_internal_hdr_info.sInfo.sType1.mMaxFrameAverageLightLevel != light_level_payload->nMaxPicAverageLight)) { 10871fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_internal_hdr_info.sInfo.sType1.mMaxContentLightLevel = light_level_payload->nMaxContentLight; 10872fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_internal_hdr_info.sInfo.sType1.mMaxFrameAverageLightLevel = light_level_payload->nMaxPicAverageLight; 10873fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return true; 10874fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 10875fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return false; 10876fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel} 10877fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10878fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelbool omx_vdec::handle_mastering_display_color_info(void* data) 10879fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{ 10880fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel struct msm_vidc_mastering_display_colour_sei_payload *mastering_display_payload = 10881fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (msm_vidc_mastering_display_colour_sei_payload*)(data); 10882fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel HDRStaticInfo* hdr_info = &m_internal_hdr_info.sInfo; 10883fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel bool internal_disp_changed_flag = false; 10884fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10885fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_disp_changed_flag = (hdr_info->sType1.mR.x != mastering_display_payload->nDisplayPrimariesX[0]) || 10886fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (hdr_info->sType1.mR.y != mastering_display_payload->nDisplayPrimariesY[0]); 10887fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_disp_changed_flag |= (hdr_info->sType1.mG.x != mastering_display_payload->nDisplayPrimariesX[1]) || 10888fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (hdr_info->sType1.mG.y != mastering_display_payload->nDisplayPrimariesY[1]); 10889fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_disp_changed_flag |= (hdr_info->sType1.mB.x != mastering_display_payload->nDisplayPrimariesX[2]) || 10890fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (hdr_info->sType1.mB.y != mastering_display_payload->nDisplayPrimariesY[2]); 10891fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10892fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_disp_changed_flag |= (hdr_info->sType1.mW.x != mastering_display_payload->nWhitePointX) || 10893fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (hdr_info->sType1.mW.y != mastering_display_payload->nWhitePointY); 10894fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10895af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel /* Maximum Display Luminance from the bitstream is in 0.0001 cd/m2 while the HDRStaticInfo extension 10896af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel requires it in cd/m2, so dividing by 10000 and rounding the value after division 10897af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel */ 10898af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel uint16_t max_display_luminance_cd_m2 = 10899af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel static_cast<int>((mastering_display_payload->nMaxDisplayMasteringLuminance / LUMINANCE_DIV_FACTOR) + 0.5); 10900af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel internal_disp_changed_flag |= (hdr_info->sType1.mMaxDisplayLuminance != max_display_luminance_cd_m2) || 10901fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (hdr_info->sType1.mMinDisplayLuminance != mastering_display_payload->nMinDisplayMasteringLuminance); 10902fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10903fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (internal_disp_changed_flag) { 10904fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mR.x = mastering_display_payload->nDisplayPrimariesX[0]; 10905fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mR.y = mastering_display_payload->nDisplayPrimariesY[0]; 10906fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mG.x = mastering_display_payload->nDisplayPrimariesX[1]; 10907fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mG.y = mastering_display_payload->nDisplayPrimariesY[1]; 10908fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mB.x = mastering_display_payload->nDisplayPrimariesX[2]; 10909fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mB.y = mastering_display_payload->nDisplayPrimariesY[2]; 10910fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mW.x = mastering_display_payload->nWhitePointX; 10911fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mW.y = mastering_display_payload->nWhitePointY; 10912fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10913af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel hdr_info->sType1.mMaxDisplayLuminance = max_display_luminance_cd_m2; 10914fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mMinDisplayLuminance = mastering_display_payload->nMinDisplayMasteringLuminance; 10915fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 10916fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10917fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return internal_disp_changed_flag; 10918fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel} 10919fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 1092011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr) 1092111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 109222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL, *p_client_extra = NULL; 109232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_U8 *pBuffer = NULL; 1092411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 num_conceal_MB = 0; 1092511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TICKS time_stamp = 0; 1092611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 frame_rate = 0; 1092711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long consumed_len = 0; 1092811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 num_MB_in_frame; 1092911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 recovery_sei_flags = 1; 1093011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int enable = OMX_InterlaceFrameProgressive; 10931fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel bool internal_hdr_info_changed_flag = false; 10932fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel bool color_event = false; 1093311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_flush_progress) 1093411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1093511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1093611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int buf_index = p_buf_hdr - m_out_mem_ptr; 1093711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_index >= drv_ctx.extradata_info.count) { 1093811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("handle_extradata: invalid index(%d) max(%d)", 1093911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_index, drv_ctx.extradata_info.count); 1094011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1094111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1094211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_panscan_window_payload *panscan_payload = NULL; 1094311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1094411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[buf_index].bufferaddr == NULL) { 1094511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("handle_extradata: Error: Mapped output buffer address is NULL"); 1094611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1094711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1094811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1094911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.extradata_info.uaddr) { 1095011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("NULL drv_ctx.extradata_info.uaddr"); 1095111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1095211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1095311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && (drv_ctx.extradata_info.buffer_size > (p_buf_hdr->nAllocLen - p_buf_hdr->nFilledLen)) ) { 1095411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Insufficient size allocated for extra-data"); 1095511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = NULL; 1095611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1095711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 109582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (!secure_mode) { 109592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel pBuffer = (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[buf_index].buffer_len, 109602601808ee2992a94c325d05e4065aba60b01840bThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, drv_ctx.ptr_outputbuffer[buf_index].pmem_fd, 0); 109612601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (pBuffer == MAP_FAILED) { 109622601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("handle_extradata output buffer mmap failed - errno: %d", errno); 109632601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return; 109642601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1096511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) 1096611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((unsigned long)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3)); 109672601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } else 1096811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = m_other_extradata; 109692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 109702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel AutoUnmap autounmap(pBuffer, drv_ctx.ptr_outputbuffer[buf_index].buffer_len); 109712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (m_client_extradata_info.getBase() && 109722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_client_extradata_info.getSize() >= drv_ctx.extradata_info.buffer_size) { 109732601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (m_client_extradata_info.getBase() + 109742601808ee2992a94c325d05e4065aba60b01840bThierry Strudel buf_index * m_client_extradata_info.getSize()); 109752601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 109762601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 1097711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size; 1097811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1097911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) { 1098011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = NULL; 1098111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra"); 1098211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1098311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1098411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_crop_updated = OMX_FALSE; 1098511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata; 1098611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (data && p_extra) { 1098711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while ((consumed_len < drv_ctx.extradata_info.buffer_size) 1098811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) { 1098911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((consumed_len + data->nSize) > (unsigned)drv_ctx.extradata_info.buffer_size) { 1099011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Invalid extra data size"); 1099111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1099211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1099311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1099411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) { 1099511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = NULL; 1099611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra"); 1099711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1099811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1099911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11000fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("handle_extradata: eType = 0x%x", data->eType); 1100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((unsigned long)data->eType) { 1100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO: 1100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_interlace_payload *payload; 1100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 interlace_color_format; 1100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel payload = (struct msm_vidc_interlace_payload *)(void *)data->data; 1100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (payload) { 1100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enable = OMX_InterlaceFrameProgressive; 1100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (payload->format) { 1100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE: 1101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 1101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST: 1101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 1101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enable = OMX_InterlaceInterleaveFrameTopFieldFirst; 1101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST: 1101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst; 1101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enable = OMX_InterlaceInterleaveFrameBottomFieldFirst; 1101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("default case - set to progressive"); 1102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 1102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (payload->color_format) { 1102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12: 1102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 1102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12_UBWC: 1102911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed; 1103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 1103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error - Unknown color format hint for interlaced frame"); 1103411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1103711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 1103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("setMetaData INTERLACED format:%d color_format: %x enable:%d mbaff:%d", 1103911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel payload->format, interlace_color_format ,enable, 1104011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (p_buf_hdr->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF)?true:false); 1104111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1104211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 1104311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PP_PARAM_INTERLACED, (void*)&enable); 1104411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1104511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (interlace_color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) { 1104611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 1104711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel LINEAR_FORMAT, (void*)&interlace_color_format); 11048fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (interlace_color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) { 11049fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 11050fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel LINEAR_FORMAT, NULL); 1105111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1105211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1105311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_INTERLACE_EXTRADATA) { 1105411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_interlace_extradata(p_extra, payload->format); 110552601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 110562601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 110572601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_interlace_extradata(p_client_extra, payload->format); 110582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) 110592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (((OMX_U8 *)p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 110602601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1106111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1106211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1106311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_FRAME_RATE: 1106411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_framerate_payload *frame_rate_payload; 1106511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_rate_payload = (struct msm_vidc_framerate_payload *)(void *)data->data; 1106611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_rate = frame_rate_payload->frame_rate; 1106711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1106811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_TIMESTAMP: 1106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_ts_payload *time_stamp_payload; 1107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_payload = (struct msm_vidc_ts_payload *)(void *)data->data; 1107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp = time_stamp_payload->timestamp_lo; 1107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32); 1107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->nTimeStamp = time_stamp; 1107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB: 1107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_concealmb_payload *conceal_mb_payload; 1107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel conceal_mb_payload = (struct msm_vidc_concealmb_payload *)(void *)data->data; 1107811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 1107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.video_resolution.frame_height + 15)) >> 8; 1108011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0); 1108111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1108211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_INDEX: 1108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int *etype; 1108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel etype = (int *)(void *)data->data; 1108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (etype && *etype == MSM_VIDC_EXTRADATA_ASPECT_RATIO) { 1108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload; 1108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)(++etype); 1108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (aspect_ratio_payload) { 1108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((struct vdec_output_frameinfo *) 1109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width; 1109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((struct vdec_output_frameinfo *) 1109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height; 1109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (etype && *etype == MSM_VIDC_EXTRADATA_OUTPUT_CROP) { 1109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_output_crop_payload *output_crop_payload; 1109611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_crop_payload = (struct msm_vidc_output_crop_payload *)(++etype); 1109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_crop_payload) { 1109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_crop_rect.nLeft = output_crop_payload->left; 1109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_crop_rect.nTop = output_crop_payload->top; 1110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_crop_rect.nWidth = output_crop_payload->left + output_crop_payload->display_width; 1110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_crop_rect.nHeight = output_crop_payload->top + output_crop_payload->display_height; 1110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_width = output_crop_payload->width; 1110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_height = output_crop_payload->height; 1110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_crop_updated = OMX_TRUE; 1110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1110711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1110811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI: 1110911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_recoverysei_payload *recovery_sei_payload; 1111011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)(void *)data->data; 1111111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel recovery_sei_flags = recovery_sei_payload->flags; 1111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) { 1111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 1111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("***************************************************"); 1111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received"); 1111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("***************************************************"); 1111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1111911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW: 1112011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel panscan_payload = (struct msm_vidc_panscan_window_payload *)(void *)data->data; 1112111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (panscan_payload->num_panscan_windows > MAX_PAN_SCAN_WINDOWS) { 1112211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Panscan windows are more than supported\n"); 1112311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Max supported = %d FW returned = %d\n", 1112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAX_PAN_SCAN_WINDOWS, panscan_payload->num_panscan_windows); 1112511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_MPEG2_SEQDISP: 11129fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_EXTRADATA_VUI_DISPLAY_INFO: 11130fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_EXTRADATA_VC1_SEQDISP: 11131fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO: 11132fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel color_event = handle_color_space_info((void *)data->data, buf_index); 1113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1113411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_S3D_FRAME_PACKING: 1113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload; 1113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel s3d_frame_packing_payload = (struct msm_vidc_s3d_frame_packing_payload *)(void *)data->data; 1113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (s3d_frame_packing_payload->fpa_type) { 1113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_FRAMEPACK_SIDE_BY_SIDE: 1113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (s3d_frame_packing_payload->content_interprtation_type == 1) 1114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stereo_output_mode = HAL_3D_SIDE_BY_SIDE_L_R; 1114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (s3d_frame_packing_payload->content_interprtation_type == 2) 1114211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stereo_output_mode = HAL_3D_SIDE_BY_SIDE_R_L; 1114311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 1114411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unsupported side-by-side framepacking type"); 1114511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stereo_output_mode = HAL_NO_3D; 1114611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_FRAMEPACK_TOP_BOTTOM: 1114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stereo_output_mode = HAL_3D_TOP_BOTTOM; 1115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unsupported framepacking type"); 1115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stereo_output_mode = HAL_NO_3D; 1115411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("setMetaData FRAMEPACKING : fpa_type = %u, content_interprtation_type = %u, stereo_output_mode= %d", 1115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel s3d_frame_packing_payload->fpa_type, s3d_frame_packing_payload->content_interprtation_type, stereo_output_mode); 1115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_FRAMEPACK_EXTRADATA) { 1115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_framepack_extradata(p_extra, s3d_frame_packing_payload); 111592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 111602601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 111612601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_framepack_extradata(p_client_extra, s3d_frame_packing_payload); 111622601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 111632601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_FRAME_QP: 1116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_frame_qp_payload *qp_payload; 1116811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qp_payload = (struct msm_vidc_frame_qp_payload*)(void *)data->data; 1116911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_QP_EXTRADATA) { 1117011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_qp_extradata(p_extra, qp_payload); 111712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 111722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 111732601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_qp_extradata(p_client_extra, qp_payload); 111742601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 111752601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_FRAME_BITS_INFO: 1117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_frame_bits_info_payload *bits_info_payload; 1118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bits_info_payload = (struct msm_vidc_frame_bits_info_payload*)(void *)data->data; 1118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_BITSINFO_EXTRADATA) { 1118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_bitsinfo_extradata(p_extra, bits_info_payload); 111832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 111842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 111852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_bitsinfo_extradata(p_client_extra, bits_info_payload); 111862601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 111872601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_STREAM_USERDATA: 1119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_EXTNUSER_EXTRADATA) { 1119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_user_extradata(p_extra, data); 111932601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 111942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 111952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_user_extradata(p_client_extra, data); 111962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 111972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1119811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_VQZIP_SEI: 1120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_vqzip_sei_payload *vqzip_payload; 1120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vqzip_payload = (struct msm_vidc_vqzip_sei_payload*)(void *)data->data; 1120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_VQZIPSEI_EXTRADATA) { 1120411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 1120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_vqzip_extradata(p_extra, vqzip_payload); 112062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 112072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 112082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_vqzip_extradata(p_client_extra, vqzip_payload); 112092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 112102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 11213fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel case MSM_VIDC_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI: 11214fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_hdr_info_changed_flag |= handle_content_light_level_info((void*)data->data); 11215fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel break; 11216fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel case MSM_VIDC_EXTRADATA_MASTERING_DISPLAY_COLOUR_SEI: 11217fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_hdr_info_changed_flag |= handle_mastering_display_color_info((void*)data->data); 11218fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel break; 1121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Unrecognized extradata"); 1122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto unrecognized_extradata; 1122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel consumed_len += data->nSize; 1122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 1122511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_FRAMEINFO_EXTRADATA) { 1122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 1122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_frame_info_extradata(p_extra, 1122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate, 1123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp, panscan_payload,&((struct vdec_output_frameinfo *) 1123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info); 112322601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 112332601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 112342601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_frame_info_extradata(p_client_extra, 112352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate, 112362601808ee2992a94c325d05e4065aba60b01840bThierry Strudel time_stamp, panscan_payload,&((struct vdec_output_frameinfo *) 112372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info); 112382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 112392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_FRAMEDIMENSION_EXTRADATA) { 1124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_frame_dimension_extradata(p_extra); 112432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 112442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 112452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_frame_dimension_extradata(p_client_extra); 112462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 112472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 11249fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 11250fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if(internal_hdr_info_changed_flag) { 11251fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel print_debug_hdr_color_info(&(m_internal_hdr_info.sInfo), "Internal"); 11252fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel print_debug_hdr_color_info(&(m_client_hdr_info.sInfo), "Client"); 11253fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel auto_lock lock(m_hdr_info_client_lock); 11254fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_change_client_hdr_info = true; 11255fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if(!color_event) { 11256fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_HIGH("Initiating PORT Reconfig due to HDR Info Change"); 11257fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel post_event(OMX_CORE_OUTPUT_PORT_INDEX, 11258fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel OMX_QTIIndexConfigDescribeHDRColorInfo, 11259fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel OMX_COMPONENT_GENERATE_PORT_RECONFIG); 11260fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 11261fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 11262fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 1126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunrecognized_extradata: 1126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata && p_extra) { 1126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 1126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_terminator_extradata(p_extra); 112682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 112692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_terminator_extradata(p_client_extra); 112702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode && p_extradata && m_other_extradata) { 1127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_output_frameinfo *ptr_extradatabuff = NULL; 1127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(p_extradata, m_other_extradata, drv_ctx.extradata_info.buffer_size); 1127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_extradatabuff = (struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate; 1127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_extradatabuff->metadata_info.metabufaddr = (void *)p_extradata; 1127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_extradatabuff->metadata_info.size = drv_ctx.extradata_info.buffer_size; 1127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_extradatabuff->metadata_info.fd = drv_ctx.extradata_info.ion.fd_ion_data.fd; 1127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_extradatabuff->metadata_info.offset = buf_index * drv_ctx.extradata_info.buffer_size; 1128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_extradatabuff->metadata_info.buffer_size = drv_ctx.extradata_info.size; 1128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11285fa202b9b18f17f7835fd602db5fff530e61112b4Thierry StrudelOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U64 requested_extradata, 1128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool is_internal, bool enable) 1128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 1128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 1129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateLoaded) { 1129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only"); 1129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 1129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%u] requested[%u] enable[%d], is_internal: %d", 1129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)client_extradata, (unsigned int)requested_extradata, enable, is_internal); 1129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!is_internal) { 1129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable) 1129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata |= requested_extradata; 1130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 1130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata = client_extradata & ~requested_extradata; 1130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable) { 1130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_INTERLACE_EXTRADATA) { 1130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO; 1130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set interlaced extradata." 1131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Quality of interlaced clips might be impacted."); 1131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) { 1131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE; 1131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set framerate extradata"); 1131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB; 1132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set concealed MB extradata"); 1132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI; 1132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata"); 1132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW; 1133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 1133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO; 1133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 1133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_capability == V4L2_PIX_FMT_MPEG2) { 1134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP; 1134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 1134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1134611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1134711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_TIMEINFO_EXTRADATA) { 1134811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1134911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP; 1135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set timeinfo extradata"); 1135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && (requested_extradata & OMX_FRAMEPACK_EXTRADATA)) { 1135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_capability == V4L2_PIX_FMT_H264) { 1135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("enable OMX_FRAMEPACK_EXTRADATA"); 1135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_S3D_FRAME_PACKING; 1135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set S3D_FRAME_PACKING extradata"); 1136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX_FRAMEPACK_EXTRADATA supported for H264 only"); 1136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_QP_EXTRADATA) { 1136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP; 1136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set QP extradata"); 1137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_BITSINFO_EXTRADATA) { 1137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_BITS_INFO; 1137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set frame bits info extradata"); 1137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && (requested_extradata & OMX_EXTNUSER_EXTRADATA)) { 1138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_STREAM_USERDATA; 1138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set stream userdata extradata"); 1138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_VQZIPSEI_EXTRADATA) { 1138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_VQZIP_SEI; 1139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set VQZip SEI extradata"); 1139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata |= OMX_VQZIPSEI_EXTRADATA; 1139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP; 1139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set QP extradata"); 1139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata |= OMX_QP_EXTRADATA; 1140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_OUTPUTCROP_EXTRADATA) { 1140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_OUTPUT_CROP; 1140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Enable output crop extra data"); 1140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set output crop extradata"); 1140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 11410fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (requested_extradata & OMX_DISPLAY_INFO_EXTRADATA) { 11411fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 11412fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch(output_capability) { 11413fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_H264: 11414fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_HEVC: 11415fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_VUI_DISPLAY; 11416fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 11417fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case CODEC_TYPE_MPEG2: 11418fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP; 11419fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 11420fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VP8: 11421fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VP9: 11422fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_VPX_COLORSPACE; 11423fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 11424fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VC1_ANNEX_G: 11425fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VC1_ANNEX_L: 11426fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_VC1_SEQDISP; 11427fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 11428fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 11429fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("Don't support Disp info for this codec : %s", drv_ctx.kind); 11430fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return ret; 11431fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 11432fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 11433fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 11434fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("Failed to set Display info extradata"); 11435fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 11436fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 11437fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (requested_extradata & OMX_HDR_COLOR_INFO_EXTRADATA) { 11438fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 11439fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (output_capability == V4L2_PIX_FMT_H264 || 11440fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel output_capability == V4L2_PIX_FMT_HEVC) { 11441fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_DISPLAY_COLOUR_SEI; 11442fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 11443fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_HIGH("Failed to set Display Colour SEI extradata"); 11444fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 11445fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI; 11446fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 11447fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_HIGH("Failed to set Content Light Level SEI extradata"); 11448fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 11449fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 11450fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 1145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = get_buffer_req(&drv_ctx.op_buf); 1145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 1145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra) 1145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0; 1145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *data_ptr = extra->data, data = 0; 1146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (byte_count < extra->nDataSize) { 1146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data = *data_ptr; 1146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (data) { 1146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_MB += (data&0x01); 1146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data >>= 1; 1146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data_ptr++; 1146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel byte_count++; 1146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 1147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.video_resolution.frame_height + 15)) >> 8; 1147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0); 1147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra) 1147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug_extradata || !extra) 1147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "============== Extra Data ==============\n" 1148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Size: %u\n" 1148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Version: %u\n" 1148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " PortIndex: %u\n" 1148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Type: %x\n" 1148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " DataSize: %u", 1148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)extra->nSize, (unsigned int)extra->nVersion.nVersion, 1148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)extra->nPortIndex, extra->eType, (unsigned int)extra->nDataSize); 1148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) { 1149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data; 1149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "------ Interlace Format ------\n" 1149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Size: %u\n" 1149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Version: %u\n" 1149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " PortIndex: %u\n" 1149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Is Interlace Format: %d\n" 1149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Interlace Formats: %u\n" 1149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "=========== End of Interlace ===========", 1150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)intfmt->nSize, (unsigned int)intfmt->nVersion.nVersion, (unsigned int)intfmt->nPortIndex, 1150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intfmt->bInterlaceFormat, (unsigned int)intfmt->nInterlaceFormats); 1150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) { 1150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data; 1150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "-------- Frame Format --------\n" 1150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Picture Type: %d\n" 1150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Interlace Type: %d\n" 1150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Pan Scan Total Frame Num: %u\n" 1151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Concealed Macro Blocks: %u\n" 1151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame rate: %u\n" 1151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Time Stamp: %llu\n" 1151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Aspect Ratio X: %u\n" 1151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Aspect Ratio Y: %u", 1151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fminfo->ePicType, 1151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fminfo->interlaceType, 1151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)fminfo->panScan.numWindows, 1151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)fminfo->nConcealedMacroblocks, 1151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)fminfo->nFrameRate, 1152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fminfo->nTimeStamp, 1152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)fminfo->aspectRatio.aspectRatioX, 1152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)fminfo->aspectRatio.aspectRatioY); 1152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) { 1152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "------------------------------" 1152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Pan Scan Frame Num: %u\n" 1152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Rectangle x: %d\n" 1152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Rectangle y: %d\n" 1153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Rectangle dx: %d\n" 1153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Rectangle dy: %d", 1153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)i, (unsigned int)fminfo->panScan.window[i].x, (unsigned int)fminfo->panScan.window[i].y, 1153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)fminfo->panScan.window[i].dx, (unsigned int)fminfo->panScan.window[i].dy); 1153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("========= End of Frame Format =========="); 1153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement) { 1153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data; 1153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "------------------ Framepack Format ----------\n" 1154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " id: %u \n" 1154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " cancel_flag: %u \n" 1154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " type: %u \n" 1154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " quincunx_sampling_flagFormat: %u \n" 1154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " content_interpretation_type: %u \n" 1154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " spatial_flipping_flag: %u \n" 1154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame0_flipped_flag: %u \n" 1154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " field_views_flag: %u \n" 1154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " current_frame_is_frame0_flag: %u \n" 1155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame0_self_contained_flag: %u \n" 1155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame1_self_contained_flag: %u \n" 1155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame0_grid_position_x: %u \n" 1155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame0_grid_position_y: %u \n" 1155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame1_grid_position_x: %u \n" 1155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame1_grid_position_y: %u \n" 1155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " reserved_byte: %u \n" 1155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " repetition_period: %u \n" 1155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " extension_flag: %u \n" 1155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "================== End of Framepack ===========", 1156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->id, 1156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->cancel_flag, 1156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->type, 1156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->quincunx_sampling_flag, 1156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->content_interpretation_type, 1156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->spatial_flipping_flag, 1156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame0_flipped_flag, 1156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->field_views_flag, 1156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->current_frame_is_frame0_flag, 1156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame0_self_contained_flag, 1157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame1_self_contained_flag, 1157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame0_grid_position_x, 1157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame0_grid_position_y, 1157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame1_grid_position_x, 1157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame1_grid_position_y, 1157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->reserved_byte, 1157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->repetition_period, 1157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->extension_flag); 1157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataQP) { 1157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_QP * qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data; 1158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "---- QP (Frame quantization parameter) ----\n" 1158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Frame QP: %u \n" 1158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "================ End of QP ================\n", 1158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)qp->nQP); 1158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo) { 1158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_BITS_INFO * bits = (OMX_QCOM_EXTRADATA_BITS_INFO *)(void *)extra->data; 1158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "--------- Input bits information --------\n" 1158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Header bits: %u \n" 1159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Frame bits: %u \n" 1159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "===== End of Input bits information =====\n", 1159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)bits->header_bits, (unsigned int)bits->frame_bits); 1159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData) { 1159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_USERDATA *userdata = (OMX_QCOM_EXTRADATA_USERDATA *)(void *)extra->data; 1159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *data_ptr = (OMX_U8 *)userdata->data; 1159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 userdata_size = extra->nDataSize - sizeof(userdata->type); 1159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 i = 0; 1159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "-------------- Userdata -------------\n" 1160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Stream userdata type: %u\n" 1160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " userdata size: %u\n" 1160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " STREAM_USERDATA:", 1160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)userdata->type, (unsigned int)userdata_size); 1160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < userdata_size; i+=4) { 1160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" %x %x %x %x", 1160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data_ptr[i], data_ptr[i+1], 1160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data_ptr[i+2], data_ptr[i+3]); 1160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "=========== End of Userdata ==========="); 1161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI) { 1161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_VQZIPSEI *vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data; 1161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "-------------- VQZip -------------\n" 1161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Size: %u\n", 1161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)vq->nSize); 1161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( "=========== End of VQZip ==========="); 1161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == OMX_ExtraDataNone) { 1161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("========== End of Terminator ==========="); 1162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("======= End of Driver Extradata ========"); 1162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 interlaced_format_type) 1162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STREAMINTERLACEFORMAT *interlace_format; 1162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) { 1163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!extra) { 1163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: append_interlace_extradata - invalid input"); 1163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE; 1163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat; 1164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT); 1164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data; 1164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT); 1164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nVersion.nVersion = OMX_SPEC_VERSION; 1164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) { 1164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->bInterlaceFormat = OMX_FALSE; 1164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive; 1165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 1165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST) { 1165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->bInterlaceFormat = OMX_TRUE; 1165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst; 1165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 1165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST) { 1165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->bInterlaceFormat = OMX_TRUE; 1165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameBottomFieldFirst; 1165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst; 1165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //default case - set to progressive 1166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->bInterlaceFormat = OMX_FALSE; 1166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive; 1166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 1166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_frame_dimension_extradata(OMX_OTHER_EXTRADATATYPE *extra) 1166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_FRAMEDIMENSION *frame_dimension; 1167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!(client_extradata & OMX_FRAMEDIMENSION_EXTRADATA)) { 1167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_FRAMEDIMENSION_EXTRADATA_SIZE; 1167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameDimension; 1167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEDIMENSION); 1167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_dimension = (OMX_QCOM_EXTRADATA_FRAMEDIMENSION *)(void *)extra->data; 1168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_dimension->nDecWidth = rectangle.nLeft; 1168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_dimension->nDecHeight = rectangle.nTop; 1168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_dimension->nActualWidth = rectangle.nWidth; 1168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_dimension->nActualHeight = rectangle.nHeight; 1168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::fill_aspect_ratio_info( 1168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_aspectratioinfo *aspect_ratio_info, 1168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info) 1168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata = frame_info; 1169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width; 1169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height; 1169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("aspectRatioX %u aspectRatioY %u", (unsigned int)m_extradata->aspectRatio.aspectRatioX, 1169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)m_extradata->aspectRatio.aspectRatioY); 1169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate, 1169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TICKS time_stamp, struct msm_vidc_panscan_window_payload *panscan_payload, 1170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_aspectratioinfo *aspect_ratio_info) 1170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL; 1170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_panscan_window *panscan_window; 1170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) { 1170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE; 1170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo; 1171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO); 1171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data; 1171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (picture_type) { 1171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case PICTURE_TYPE_I: 1171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->ePicType = OMX_VIDEO_PictureTypeI; 1171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case PICTURE_TYPE_P: 1171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->ePicType = OMX_VIDEO_PictureTypeP; 1171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case PICTURE_TYPE_B: 1172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->ePicType = OMX_VIDEO_PictureTypeB; 1172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0; 1172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 1172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 1172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 1172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 1173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 1173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive; 1173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio)); 1173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->nConcealedMacroblocks = num_conceal_mb; 1173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->nFrameRate = frame_rate; 1173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->nTimeStamp = time_stamp; 1173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->panScan.numWindows = 0; 1173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_capability == V4L2_PIX_FMT_MPEG2) { 1173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_disp_hor_size && m_disp_vert_size) { 1173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size; 1174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size; 1174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->displayAspectRatio.displayHorizontalSize = 0; 1174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->displayAspectRatio.displayVerticalSize = 0; 1174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (panscan_payload) { 1174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->panScan.numWindows = panscan_payload->num_panscan_windows; 1174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel panscan_window = &panscan_payload->wnd[0]; 1175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) { 1175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->panScan.window[i].x = panscan_window->panscan_window_width; 1175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->panScan.window[i].y = panscan_window->panscan_window_height; 1175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset; 1175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset; 1175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel panscan_window++; 1175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fill_aspect_ratio_info(aspect_ratio_info, frame_info); 1175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra) 1176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL; 1176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE; 1176611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1176711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1176811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef; 1176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 1177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)(void *)extra->data; 1177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *portDefn = m_port_def; 1177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u " 1177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "stride = %u sliceheight = %u",(unsigned int)portDefn->format.video.nFrameHeight, 1177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameWidth, 1177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nStride, 1177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nSliceHeight); 1177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload) 1178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack; 1178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (FRAME_PACK_SIZE*sizeof(OMX_U32) != sizeof(struct msm_vidc_s3d_frame_packing_payload)) { 1178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("frame packing size mismatch"); 1178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_FRAMEPACK_EXTRADATA_SIZE; 1178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement; 1179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT); 1179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data; 1179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framepack->nSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT); 1179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framepack->nVersion.nVersion = OMX_SPEC_VERSION; 1179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framepack->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&framepack->id, s3d_frame_packing_payload, 1179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(struct msm_vidc_s3d_frame_packing_payload)); 1179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&m_frame_pack_arrangement, framepack, 1179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT)); 1180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_frame_qp_payload *qp_payload) 1180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_QP * qp = NULL; 1180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!qp_payload) { 1180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("QP payload is NULL"); 1180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_QP_EXTRADATA_SIZE; 1181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataQP; 1181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_QP); 1181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data; 1181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qp->nQP = qp_payload->frame_qp; 1181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_frame_bits_info_payload *bits_payload) 1182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_BITS_INFO * bits = NULL; 1182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!bits_payload) { 1182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("bits info payload is NULL"); 1182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_BITSINFO_EXTRADATA_SIZE; 1183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo; 1183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_BITS_INFO); 1183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bits = (OMX_QCOM_EXTRADATA_BITS_INFO*)(void *)extra->data; 1183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bits->frame_bits = bits_payload->frame_bits; 1183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bits->header_bits = bits_payload->header_bits; 1183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OTHER_EXTRADATATYPE *p_user) 1184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int userdata_size = 0; 1184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_stream_userdata_payload *userdata_payload = NULL; 1184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel userdata_payload = 1184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (struct msm_vidc_stream_userdata_payload *)(void *)p_user->data; 1184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel userdata_size = p_user->nDataSize; 1184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_USERDATA_EXTRADATA_SIZE + userdata_size; 1184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData; 1185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = userdata_size; 1185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra->nDataSize && (p_user->nDataSize >= extra->nDataSize)) 1185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(extra->data, p_user->data, extra->nDataSize); 1185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra) 1185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_extradata) { 1186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE); 1186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = OMX_ExtraDataNone; 1186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = 0; 1186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->data[0] = 0; 1186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_vqzip_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_vqzip_sei_payload *vqzip_payload) 1187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_VQZIPSEI *vq = NULL; 1187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_VQZIPSEI_EXTRADATA_SIZE + vqzip_payload->size; 1187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI; 1188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_VQZIPSEI) + vqzip_payload->size; 1188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data; 1188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vq->nSize = vqzip_payload->size; 1188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(vq->data, vqzip_payload->data, vqzip_payload->size); 1188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_desc_buffer(OMX_U32 index) 1189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index >= drv_ctx.ip_buf.actualcount) { 1189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found"); 1189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_desc_buffer_ptr == NULL) { 1189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_desc_buffer_ptr = (desc_buffer_hdr*) \ 1189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(desc_buffer_hdr)), 1190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 1190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_desc_buffer_ptr == NULL) { 1190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed "); 1190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8)); 1190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_desc_buffer_ptr[index].buf_addr == NULL) { 1190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("desc buffer Allocation failed "); 1191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset) 1191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inserting address offset (%u) at idx (%u)", (unsigned int)address_offset,(unsigned int)m_demux_entries); 1191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_demux_entries < 8192) { 1192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_offsets[m_demux_entries++] = address_offset; 1192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr) 1192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 bytes_to_parse = buf_hdr->nFilledLen; 1192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset; 1192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 index = 0; 1193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_entries = 0; 1193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (index < bytes_to_parse) { 1193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 1193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) || 1193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 1193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (buf[index+2] == 0x01)) ) { 1193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Found start code, insert address offset 1193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel insert_demux_addr_offset(index); 1194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf[index+2] == 0x01) // 3 byte start code 1194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index += 3; 1194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else //4 byte start code 1194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index += 4; 1194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 1194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index++; 1194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Extracted (%u) demux entry offsets", (unsigned int)m_demux_entries); 1194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr) 1195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //fix this, handle 3 byte start code, vc1 terminator entry 1195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *p_demux_data = NULL; 1195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 desc_data = 0; 1195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 start_addr = 0; 1195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 nal_size = 0; 1195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 suffix_byte = 0; 1195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 demux_index = 0; 1196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 buffer_index = 0; 1196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_desc_buffer_ptr == NULL) { 1196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries."); 1196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 1196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_index > drv_ctx.ip_buf.actualcount) { 1196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%u)", (unsigned int)buffer_index); 1197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr; 1197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( ((OMX_U8*)p_demux_data == NULL) || 1197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) { 1197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries."); 1197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; demux_index < m_demux_entries; demux_index++) { 1198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel desc_data = 0; 1198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel start_addr = m_demux_offsets[demux_index]; 1198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) { 1198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3]; 1198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4]; 1198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (demux_index < (m_demux_entries - 1)) { 1198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2; 1199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2; 1199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Start_addr(0x%x), suffix_byte(0x%x),nal_size(%u),demux_index(%u)", 1199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)start_addr, 1199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)suffix_byte, 1199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)nal_size, 1199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)demux_index); 1199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel desc_data = (start_addr >> 3) << 1; 1199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel desc_data |= (start_addr & 7) << 21; 1200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel desc_data |= suffix_byte << 24; 1200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 1200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32)); 1200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 1200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 1200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_demux_data += 16; 1200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_type_parse == CODEC_TYPE_VC1) { 1201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("VC1 terminator entry"); 1201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel desc_data = 0; 1201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel desc_data = 0x82 << 24; 1201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 1201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(p_demux_data + 4, 0, sizeof(OMX_U32)); 1201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 1201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 1201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_demux_data += 16; 1201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_entries++; 1201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Add zero word to indicate end of descriptors 1202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(p_demux_data, 0, sizeof(OMX_U32)); 1202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32); 1202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("desc table data size=%u", (unsigned int)m_desc_buffer_ptr[buffer_index].desc_data_size); 1202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 1202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_entries = 0; 1202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Demux table complete!"); 1202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::request_perf_level(enum vidc_perf_level perf_level) 1203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 1203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char property_value[PROPERTY_VALUE_MAX] = {0}; 1203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.debug.turbo", property_value, "0"); 1203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&control, 0, sizeof(v4l2_control)); 1203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL; 1204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (perf_level) { 1204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VIDC_NOMINAL: 1204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(property_value)) 1204311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO; 1204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 1204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL; 1204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VIDC_TURBO: 1204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO; 1204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Requested PERF level not supported"); 1205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((current_perf_level == (OMX_U32)control.value) && !in_reconfig) 1205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("changing performance level to %d", control.value); 1205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel current_perf_level = control.value; 1206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set PERF level"); 1206211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1206311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf() 1206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enabled = false; 1206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx = NULL; 1206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel init_members(); 1207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ColorFormat = OMX_COLOR_FormatMax; 1207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_format = YCbCr420P; 1207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_c2d_width = 0; 1207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_c2d_height = 0; 1207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client) 1207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx = reinterpret_cast<omx_vdec*>(client); 1207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::allocate_color_convert_buf::init_members() 1208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocated_count = 0; 1208411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size_req = 0; 1208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_alignment_req = 0; 1208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_c2d_width = m_c2d_height = 0; 1208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_platform_list_client,0,sizeof(m_platform_list_client)); 1208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_platform_entry_client,0,sizeof(m_platform_entry_client)); 1208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_pmem_info_client,0,sizeof(m_pmem_info_client)); 1209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client)); 1209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 1209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(op_buf_ion_info,0,sizeof(m_platform_entry_client)); 1209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (int i = 0; i < MAX_COUNT; i++) 1209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd[i] = -1; 1209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() 1209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.destroy(); 1210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::update_buffer_req() 1210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 1210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int src_size = 0, destination_size = 0; 121072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel unsigned int height, width; 121082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel struct v4l2_format fmt; 1210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COLOR_FORMATTYPE drv_color_format; 121102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 1211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx) { 1211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid client in color convert"); 1211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 1211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) { 1211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("No color conversion required"); 1211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 1211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&omx->c_lock); 1212011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 121212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 121222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 121232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.pixelformat = omx->capture_capability; 121242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 121252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel width = fmt.fmt.pix_mp.width; 121262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel height = fmt.fmt.pix_mp.height; 121272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 121282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel bool resolution_upgrade = (height > m_c2d_height || 121292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel width > m_c2d_width); 1213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (resolution_upgrade) { 1213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // resolution upgraded ? ensure we are yet to allocate; 1213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // failing which, c2d buffers will never be reallocated and bad things will happen 1213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocated_count > 0) { 1213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Cannot change C2D buffer requirements with %d active allocations", 1213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocated_count); 1213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto fail_update_buf_req; 1213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 && 1214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ColorFormat != OMX_COLOR_FormatYUV420Planar) { 1214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion"); 1214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto fail_update_buf_req; 1214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.close(); 121482601808ee2992a94c325d05e4065aba60b01840bThierry Strudel status = c2d.open(height, 121492601808ee2992a94c325d05e4065aba60b01840bThierry Strudel width, 1215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NV12_128m,dest_format); 1215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status) { 1215211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = c2d.get_buffer_size(C2D_INPUT,src_size); 1215311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status) 1215411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = c2d.get_buffer_size(C2D_OUTPUT,destination_size); 1215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status) { 1215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size || 1215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !destination_size) { 1215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d" 1216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "driver size %u destination size %d", 1216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel src_size, (unsigned int)omx->drv_ctx.op_buf.buffer_size, 1216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel destination_size); 1216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.close(); 1216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size_req = 0; 1216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // TODO: make this fatal. Driver is not supposed to quote size 1216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // smaller than what C2D needs !! 1216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size_req = destination_size; 121702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_c2d_height = height; 121712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_c2d_width = width; 1217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelfail_update_buf_req: 1217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->c_lock); 1217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 1217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::set_color_format( 1218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COLOR_FORMATTYPE dest_color_format) 1218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 12182b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool status = true, drv_colorformat_c2d_enable = false; 12183b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool dest_color_format_c2d_enable = false; 12184b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel OMX_COLOR_FORMATTYPE drv_color_format = OMX_COLOR_FormatUnused; 1218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx) { 1218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid client in color convert"); 1218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 1218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&omx->c_lock); 1219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 1219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) 1219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_color_format = (OMX_COLOR_FORMATTYPE) 1219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView; 1219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 1219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_color_format = (OMX_COLOR_FORMATTYPE) 1219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 1219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) { 1219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_color_format = (OMX_COLOR_FORMATTYPE) 1219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed; 12200b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) { 12201b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel drv_color_format = (OMX_COLOR_FORMATTYPE) 12202b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed; 1220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Incorrect color format"); 1220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 12207b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel drv_colorformat_c2d_enable = (drv_color_format != dest_color_format) && 12208b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel (drv_color_format != (OMX_COLOR_FORMATTYPE) 12209b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView) && 12210b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel (drv_color_format != (OMX_COLOR_FORMATTYPE) 12211b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) && 12212b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel (drv_color_format != (OMX_COLOR_FORMATTYPE) 12213b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed); 12214b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 12215b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel dest_color_format_c2d_enable = (dest_color_format != (OMX_COLOR_FORMATTYPE) 12216b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) && 12217b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel (dest_color_format != (OMX_COLOR_FORMATTYPE) 12218b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed); 12219b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 12220b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (status && drv_colorformat_c2d_enable && dest_color_format_c2d_enable) { 1222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Enabling C2D"); 1222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((dest_color_format != OMX_COLOR_FormatYUV420Planar) && 1222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (dest_color_format != OMX_COLOR_FormatYUV420SemiPlanar)) { 1222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unsupported color format for c2d"); 1222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ColorFormat = dest_color_format; 1222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_format = (dest_color_format == OMX_COLOR_FormatYUV420Planar) ? 1222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel YCbCr420P : YCbCr420SP; 1223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enabled) 1223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.destroy(); 1223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enabled = false; 1223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!c2d.init()) { 1223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("open failed for c2d"); 1223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 1223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enabled = true; 1223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enabled) 1224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.destroy(); 1224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enabled = false; 1224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->c_lock); 1224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 1224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr() 1224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx) { 1225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 1225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 1225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) 1225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return omx->m_out_mem_ptr; 1225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return m_out_mem_ptr_client; 1225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr 1226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(OMX_BUFFERHEADERTYPE *bufadd) 1226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx) { 1226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 1226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 1226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) 1226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bufadd; 1226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned index = 0; 1227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufadd - omx->m_out_mem_ptr; 1227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < omx->drv_ctx.op_buf.actualcount) { 1227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS); 1227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp; 1227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status; 1227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) { 1227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&omx->c_lock); 1227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cache_clean_buffer(index); 1227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd, 1227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer, pmem_fd[index], 1228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_baseaddress[index], pmem_baseaddress[index]); 1228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!status) { 1228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed color conversion %d", status); 1228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[index].nFilledLen = 0; 1228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->c_lock); 1228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return &m_out_mem_ptr_client[index]; 1228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int filledLen = 0; 1228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.get_output_filled_length(filledLen); 1228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[index].nFilledLen = filledLen; 1229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cache_clean_invalidate_buffer(index); 1229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->c_lock); 1229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 1229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[index].nFilledLen = 0; 1229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return &m_out_mem_ptr_client[index]; 1229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr"); 1229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 1229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr 1230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(OMX_BUFFERHEADERTYPE *bufadd) 1230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx) { 1230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 1230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 1230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) 1230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bufadd; 1231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned index = 0; 1231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufadd - m_out_mem_ptr_client; 1231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < omx->drv_ctx.op_buf.actualcount) { 1231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return &omx->m_out_mem_ptr[index]; 1231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr"); 1231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 1231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool omx_vdec::allocate_color_convert_buf::get_buffer_req 1231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(unsigned int &buffer_size) 1232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 1232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&omx->c_lock); 1232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) 1232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size = omx->drv_ctx.op_buf.buffer_size; 1232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 1232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) { 1232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get buffer size failed"); 1232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto fail_get_buffer_size; 1233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelfail_get_buffer_size: 1233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->c_lock); 1233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 1233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::set_buffer_req( 1233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 buffer_size, OMX_U32 actual_count) { 1233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 expectedSize = enabled ? buffer_size_req : omx->drv_ctx.op_buf.buffer_size; 1234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_size < expectedSize) { 1234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OP Requirements: Client size(%u) insufficient v/s requested(%u)", 1234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size, expectedSize); 1234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (actual_count < omx->drv_ctx.op_buf.actualcount) { 1234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OP Requirements: Client count(%u) insufficient v/s requested(%u)", 1234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel actual_count, omx->drv_ctx.op_buf.actualcount); 1234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool reqs_updated = false; 1235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enabled) { 1235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // disallow changing buffer size/count while we have active allocated buffers 1235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocated_count > 0) { 1235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Cannot change C2D buffer size from %u to %u with %d active allocations", 1235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size_req, buffer_size, allocated_count); 1235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 1235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size_req = buffer_size; 1236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_size > omx->drv_ctx.op_buf.buffer_size) { 1236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.op_buf.buffer_size = buffer_size; 1236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reqs_updated = true; 1236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (actual_count > omx->drv_ctx.op_buf.actualcount) { 1237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.op_buf.actualcount = actual_count; 1237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reqs_updated = true; 1237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (reqs_updated) { 1237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.extradata_info.count = omx->drv_ctx.op_buf.actualcount; 1237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.extradata_info.size = omx->drv_ctx.extradata_info.count * 1237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.extradata_info.buffer_size; 1237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return omx->set_buffer_req(&(omx->drv_ctx.op_buf)); 1237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer( 1238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufhdr) 1238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = 0; 1238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) 1238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return omx->free_output_buffer(bufhdr); 1239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enabled && omx->is_component_secure()) 1239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!allocated_count || !bufhdr) { 1239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr); 1239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufhdr - m_out_mem_ptr_client; 1239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index >= omx->drv_ctx.op_buf.actualcount) { 1239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer"); 1239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_fd[index] >= 0) { 1240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(pmem_baseaddress[index], buffer_size_req); 1240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd[index]); 1240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd[index] = -1; 1240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 1240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->free_ion_memory(&op_buf_ion_info[index]); 1240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_heap_ptr[index].video_heap_ptr = NULL; 1241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocated_count > 0) 1241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocated_count--; 1241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 1241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocated_count = 0; 1241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!allocated_count) { 1241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&omx->c_lock); 1241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.close(); 1241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel init_members(); 1241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->c_lock); 1241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return omx->free_output_buffer(&omx->m_out_mem_ptr[index]); 1242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp, 1242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes) 1242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) { 1242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes); 1242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enabled && omx->is_component_secure()) { 1243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d", 1243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->is_component_secure()); 1243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 1243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!bufferHdr || bytes > buffer_size_req) { 1243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr); 1243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("color_convert buffer_size_req %u bytes %u", 1243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)buffer_size_req, (unsigned int)bytes); 1244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocated_count >= omx->drv_ctx.op_buf.actualcount) { 1244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert"); 1244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL; 1244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr, 1244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel port,appData,omx->drv_ctx.op_buf.buffer_size); 1244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone || !temp_bufferHdr) { 1245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Buffer allocation failed color_convert"); 1245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1245211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((temp_bufferHdr - omx->m_out_mem_ptr) >= 1245411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)omx->drv_ctx.op_buf.actualcount) { 1245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid header index %ld", 1245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (long int)(temp_bufferHdr - omx->m_out_mem_ptr)); 1245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 1245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int i = allocated_count; 1246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 1246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Allocate color-conversion buffers as cached to improve software-reading 1246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // performance of YUV (thumbnails). NOTE: These buffers will need an explicit 1246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // cache invalidation. 1246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory( 1246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size_req,buffer_alignment_req, 1246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data, 1246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ION_FLAG_CACHED); 1246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd; 1246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (op_buf_ion_info[i].ion_device_fd < 0) { 1247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert"); 1247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req, 1247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0); 1247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_baseaddress[i] == MAP_FAILED) { 1247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req); 1247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd[i]); 1247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->free_ion_memory(&op_buf_ion_info[i]); 1248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_heap_ptr[i].video_heap_ptr = new VideoHeap ( 1248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel op_buf_ion_info[i].ion_device_fd,buffer_size_req, 1248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]); 1248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info_client[i].pmem_fd = (unsigned long)m_heap_ptr[i].video_heap_ptr.get(); 1248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info_client[i].offset = 0; 1248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i]; 1248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 1249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list_client[i].nEntries = 1; 1249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list_client[i].entryList = &m_platform_entry_client[i]; 1249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].pOutputPortPrivate = NULL; 1249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].nAllocLen = buffer_size_req; 1249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].nFilledLen = 0; 1249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].nFlags = 0; 1249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE); 1249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION; 1249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i]; 1250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i]; 1250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].pAppPrivate = appData; 1250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = &m_out_mem_ptr_client[i]; 1250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("IL client buffer header %p", *bufferHdr); 1250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocated_count++; 1250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::is_component_secure() 1250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return secure_mode; 1251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format) 1251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 1251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) { 1251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) { 1251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) 1251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_color_format = (OMX_COLOR_FORMATTYPE) 1252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView; 1252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 1252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 1252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC){ 1252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed; 12525b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC){ 12526b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed; 1252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 1252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ColorFormat == OMX_COLOR_FormatYUV420Planar || 1253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) { 1253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_color_format = ColorFormat; 1253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 1253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 1253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::cache_ops( 1254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index, unsigned int cmd) 1254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) { 1254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx || index >= omx->drv_ctx.op_buf.actualcount) { 1254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: Invalid param", __func__); 1254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_flush_data flush_data; 1255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_custom_data custom_data; 1255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&flush_data, 0x0, sizeof(flush_data)); 1255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&custom_data, 0x0, sizeof(custom_data)); 1255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flush_data.vaddr = pmem_baseaddress[index]; 1255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flush_data.fd = op_buf_ion_info[index].fd_ion_data.fd; 1255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flush_data.handle = op_buf_ion_info[index].fd_ion_data.handle; 1256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flush_data.length = buffer_size_req; 1256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel custom_data.cmd = cmd; 1256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel custom_data.arg = (unsigned long)&flush_data; 1256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Cache %s: fd=%d handle=%d va=%p size=%d", 1256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate", 1256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flush_data.fd, flush_data.handle, flush_data.vaddr, 1256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flush_data.length); 1256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret = ioctl(op_buf_ion_info[index].ion_device_fd, ION_IOC_CUSTOM, &custom_data); 1256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret < 0) { 1257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Cache %s failed: %s\n", 1257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate", 1257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strerror(errno)); 1257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 1257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::buf_ref_add(int nPortIndex) 1257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long i = 0; 1258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool buf_present = false; 1258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel long fd = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 1258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 offset = drv_ctx.ptr_outputbuffer[nPortIndex].offset; 1258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dynamic_buf_mode || !out_dynamic_list) { 1258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 1259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.op_buf.actualcount; i++) { 1259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //check the buffer fd, offset, uv addr with list contents 1259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //If present increment reference. 1259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((out_dynamic_list[i].fd == fd) && 1259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (out_dynamic_list[i].offset == offset)) { 1259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("buf_ref_add: [ALREADY PRESENT] fd = %u ref_count = %u", 1259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count); 1259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 1259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = out_dynamic_list[i].buffaddr; 1259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_present = true; 1260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!buf_present) { 1260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.op_buf.actualcount; i++) { 1260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //search for a entry to insert details of the new buffer 1260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (out_dynamic_list[i].dup_fd < 0) { 1260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].fd = fd; 1260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].offset = offset; 1261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].dup_fd = dup(fd); 1261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].ref_count++; 1261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("buf_ref_add: [ADDED] fd = %u ref_count = %u", 1261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count); 1261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 1261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = 1261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len, 1261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, 1261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd, 0); 1262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //mmap returns (void *)-1 on failure and sets error code in errno. 1262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr == MAP_FAILED) { 1262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("buf_ref_add: mmap failed - errno: %d", errno); 1262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = NULL; 1262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].buffaddr = drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr; 1262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].mapped_size = drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len; 1262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("mmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size); 1262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1263211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 1263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::buf_ref_remove() 1263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long i = 0; 1264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dynamic_buf_mode || !out_dynamic_list) { 1264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 1264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.op_buf.actualcount; i++) { 1264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && out_dynamic_list[i].buffaddr && out_dynamic_list[i].mapped_size) { 1264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("munmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size); 1264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(out_dynamic_list[i].buffaddr, 1265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].mapped_size); 1265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("buf_ref_remove: [REMOVED] fd = %u ref_count = %u", 1265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count); 1265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(out_dynamic_list[i].dup_fd); 1265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].dup_fd = -1; 1265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 1265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (out_dynamic_list) { 1266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(out_dynamic_list); 1266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list = NULL; 1266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 1266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::send_codec_config() { 1266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_config_flag) { 1266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1 = 0; // Parameter - 1 1267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2 = 0; // Parameter - 2 1267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident = 0; 1267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 1267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("\n Check Queue for codec_config buffer \n"); 1267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_etb_q.m_size) { 1267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.pop_entry(&p1,&p2,&ident); 1267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 1267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 1267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\ 1267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 1268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure"); 1268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error(); 1268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 1268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 1268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_ETB) { 1268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 1268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 1269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 1269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure"); 1269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 1269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers++; 12696b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 1269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 1269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 1269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 1270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_EBD) { 1270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p", 1270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p1); 1270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 1270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 1270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_control::perf_control() 1271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lib = NULL; 1271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_handle = 0; 1271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock_acquire = NULL; 1271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock_release = NULL; 1271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_control::~perf_control() 1272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_handle != 0 && m_perf_lock_release) { 1272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("NOTE2: release perf lock"); 1272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock_release(m_perf_handle); 1272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_lib) { 1272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlclose(m_perf_lib); 1272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct omx_vdec::perf_control::mpctl_stats omx_vdec::perf_control::mpctl_obj = {0, 0, 0}; 1273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_lock omx_vdec::perf_control::m_perf_lock; 1273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::perf_control::send_hint_to_mpctl(bool state) 1273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (load_lib() == false) { 1273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock.lock(); 1274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 0x4401 maps to video decode playback hint 1274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * in perflock, enum number is 44 and state 1274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * being sent on perflock acquire is 01 (true) 1274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 1274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int arg = 0x4401; 1274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (state == true) { 1274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mpctl_obj.vid_inst_count++; 1274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (state == false) { 1275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mpctl_obj.vid_inst_count--; 1275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_lock_acquire && mpctl_obj.vid_inst_count == 1 && mpctl_obj.vid_acquired == false) { 1275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mpctl_obj.vid_disp_handle = m_perf_lock_acquire(0, 0, &arg, sizeof(arg) / sizeof(int)); 1275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mpctl_obj.vid_acquired = true; 1275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("Video slvp perflock acquired"); 1275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_perf_lock_release && (mpctl_obj.vid_inst_count == 0 || mpctl_obj.vid_inst_count > 1) && mpctl_obj.vid_acquired == true) { 1275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock_release(mpctl_obj.vid_disp_handle); 1275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mpctl_obj.vid_acquired = false; 1276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("Video slvp perflock released"); 1276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock.unlock(); 1276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::perf_control::request_cores(int frame_duration_us) 1276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frame_duration_us > MIN_FRAME_DURATION_FOR_PERF_REQUEST_US) { 1276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool retVal = load_lib(); 1277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retVal && m_perf_lock_acquire && m_perf_handle == 0) { 1277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int arg = 0x700 /*base value*/ + 2 /*cores*/; 1277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_handle = m_perf_lock_acquire(m_perf_handle, 0, &arg, sizeof(arg)/sizeof(int)); 1277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_handle) { 1277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("perf lock acquired"); 1277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::perf_control::load_lib() 1278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char perf_lib_path[PROPERTY_VALUE_MAX] = {0}; 1278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_lib) 1278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 1278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((property_get("ro.vendor.extension_library", perf_lib_path, NULL) <= 0)) { 1278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("vendor library not set in ro.vendor.extension_library"); 1278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto handle_err; 1278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_perf_lib = dlopen(perf_lib_path, RTLD_NOW)) == NULL) { 1279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to open %s : %s",perf_lib_path, dlerror()); 1279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto handle_err; 1279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock_acquire = (perf_lock_acquire_t)dlsym(m_perf_lib, "perf_lock_acq"); 1279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_lock_acquire == NULL) { 1279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_acq"); 1279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto handle_err; 1279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock_release = (perf_lock_release_t)dlsym(m_perf_lib, "perf_lock_rel"); 1280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_lock_release == NULL) { 1280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_rel"); 1280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto handle_err; 1280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 1280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelhandle_err: 1280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_lib) { 1281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlclose(m_perf_lib); 1281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lib = NULL; 1281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 1281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::enable_adaptive_playback(unsigned long nMaxFrameWidth, 1281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long nMaxFrameHeight) 1281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret = 0; 1282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long min_res_buf_count = 0; 1282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_smoothstreaming(); 1282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 1282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to enable Adaptive Playback on driver"); 1282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enabling Adaptive playback for %lu x %lu", 1283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nMaxFrameWidth, 1283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nMaxFrameHeight); 1283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_mode = true; 1283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_width = nMaxFrameWidth; 1283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_height = nMaxFrameHeight; 1283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Get upper limit buffer count for min supported resolution 1283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 1283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_decoder_capability.min_height; 1284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_decoder_capability.min_width; 1284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 1284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 1284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Resolution failed for HxW = %ux%u", 1284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_height, 1284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_width); 1284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 1285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 1285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 1285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("failed to get_buffer_req"); 1285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_res_buf_count = drv_ctx.op_buf.mincount; 1285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("enable adaptive - upper limit buffer count = %lu for HxW %ux%u", 1286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_res_buf_count, m_decoder_capability.min_height, m_decoder_capability.min_width); 1286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12862fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nLeft = 0; 12863fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nTop = 0; 12864fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nWidth = m_smoothstreaming_width; 12865fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nHeight = m_smoothstreaming_height; 12866fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 1286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel update_resolution(m_smoothstreaming_width, m_smoothstreaming_height, 1286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_width, m_smoothstreaming_height); 1286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = is_video_session_supported(); 1287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 1287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("video session is not supported"); 1287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Get upper limit buffer size for max smooth streaming resolution set 1287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 1287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 1287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 1288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 1288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Resolution failed for adaptive playback"); 1288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 1288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 1288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 1288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("failed to get_buffer_req!!"); 1288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("enable adaptive - upper limit buffer size = %u", 1289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.op_buf.buffer_size); 1289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.mincount = min_res_buf_count; 1289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount = min_res_buf_count; 1289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size = drv_ctx.op_buf.buffer_size; 1289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_buffer_req(&drv_ctx.op_buf); 1289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 1289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("failed to set_buffer_req"); 1290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 1290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 1290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("failed to get_buffer_req!!!"); 1290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("adaptive playback enabled, buf count = %u bufsize = %u", 1290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.mincount, (unsigned int)drv_ctx.op_buf.buffer_size); 1291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//static 1291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::describeColorFormat(OMX_PTR pParam) { 1291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef FLEXYUV_SUPPORTED 1291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 1291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 1291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam == NULL) { 1292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("describeColorFormat: invalid params"); 1292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DescribeColorFormatParams *params = (DescribeColorFormatParams*)pParam; 1292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MediaImage *img = &(params->sMediaImage); 1292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch(params->eColorFormat) { 1292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m: 1293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 1293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mType = MediaImage::MEDIA_IMAGE_TYPE_YUV; 1293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mNumPlanes = 3; 1293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // mWidth and mHeight represent the W x H of the largest plane 1293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // In our case, this happens to be the Stride x Scanlines of Y plane 1293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mWidth = params->nFrameWidth; 1293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mHeight = params->nFrameHeight; 1293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size_t planeWidth = VENUS_Y_STRIDE(COLOR_FMT_NV12, params->nFrameWidth); 1293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size_t planeHeight = VENUS_Y_SCANLINES(COLOR_FMT_NV12, params->nFrameHeight); 1293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mBitDepth = 8; 1294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Plane 0 (Y) 1294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::Y].mOffset = 0; 1294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::Y].mColInc = 1; 1294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::Y].mRowInc = planeWidth; //same as stride 1294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::Y].mHorizSubsampling = 1; 1294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::Y].mVertSubsampling = 1; 1294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Plane 1 (U) 1294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::U].mOffset = planeWidth * planeHeight; 1294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::U].mColInc = 2; //interleaved UV 1294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::U].mRowInc = 1295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth); 1295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::U].mHorizSubsampling = 2; 1295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::U].mVertSubsampling = 2; 1295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Plane 2 (V) 1295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::V].mOffset = planeWidth * planeHeight + 1; 1295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::V].mColInc = 2; //interleaved UV 1295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::V].mRowInc = 1295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth); 1295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::V].mHorizSubsampling = 2; 1295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::V].mVertSubsampling = 2; 1296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COLOR_FormatYUV420Planar: 1296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COLOR_FormatYUV420SemiPlanar: 1296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // We need not describe the standard OMX linear formats as these are 1296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // understood by client. Fail this deliberately to let client fill-in 1296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 1296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Rest all formats which are non-linear cannot be described 1297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("color-format %x is not flexible", params->eColorFormat); 1297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 1297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel }; 1297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("NOTE: Describe color format : %x", params->eColorFormat); 1297711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" FrameWidth x FrameHeight : %d x %d", params->nFrameWidth, params->nFrameHeight); 1297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" YWidth x YHeight : %d x %d", img->mWidth, img->mHeight); 1297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (size_t i = 0; i < img->mNumPlanes; ++i) { 1298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Plane[%zu] : offset=%d / xStep=%d / yStep = %d", 1298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel i, img->mPlane[i].mOffset, img->mPlane[i].mColInc, img->mPlane[i].mRowInc); 1298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //FLEXYUV_SUPPORTED 1298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::prefetchNewBuffers() { 1298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_decoder_cmd dec; 1299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t prefetch_count; 1299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t prefetch_size; 1299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t want_size; 1299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t have_size; 1299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int color_fmt, rc; 1299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t new_calculated_size; 1299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t new_buffer_size; 1299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t new_buffer_count; 1299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t old_buffer_size; 1299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t old_buffer_count; 1300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&dec, 0 , sizeof(dec)); 1300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Old size : %zu, count : %d, width : %u, height : %u\n", 1300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size, drv_ctx.op_buf.actualcount, 1300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width, 1300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height); 1300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec.cmd = V4L2_DEC_QCOM_CMD_RECONFIG_HINT; 1300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 1300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Buffer info cmd failed : %d\n", errno); 1300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("From driver, new size is %d, count is %d\n", 1301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec.raw.data[0], dec.raw.data[1]); 1301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((int)drv_ctx.output_format) { 1301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_YUV_FORMAT_NV12: 1301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_fmt = COLOR_FMT_NV12; 1301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_YUV_FORMAT_NV12_UBWC: 1301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_fmt = COLOR_FMT_NV12_UBWC; 1302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 13021b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel case VDEC_YUV_FORMAT_NV12_TP10_UBWC: 13022b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel color_fmt = COLOR_FMT_NV12_BPP10_UBWC; 13023b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel break; 1302411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1302511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_fmt = -1; 1302611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Color format : %x not supported for secure memory prefetching\n", drv_ctx.output_format); 1302711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1302811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1302911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1303011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_calculated_size = VENUS_BUFFER_SIZE(color_fmt, m_reconfig_width, m_reconfig_height); 1303111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("New calculated size for width : %d, height : %d, is %d\n", 1303211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_reconfig_width, m_reconfig_height, new_calculated_size); 1303311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_buffer_size = (dec.raw.data[0] > new_calculated_size) ? dec.raw.data[0] : new_calculated_size; 1303411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_buffer_count = dec.raw.data[1]; 1303511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel old_buffer_size = drv_ctx.op_buf.buffer_size; 1303611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel old_buffer_count = drv_ctx.op_buf.actualcount; 1303711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1303811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_buffer_count = old_buffer_count > new_buffer_count ? old_buffer_count : new_buffer_count; 1303911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1304011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prefetch_count = new_buffer_count; 1304111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prefetch_size = new_buffer_size - old_buffer_size; 1304211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel want_size = new_buffer_size * new_buffer_count; 1304311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel have_size = old_buffer_size * old_buffer_count; 1304411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1304511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (want_size > have_size) { 1304611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Want: %d, have : %d\n", want_size, have_size); 1304711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("prefetch_count: %d, prefetch_size : %d\n", prefetch_count, prefetch_size); 1304811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1304911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ion_fd = open(MEM_DEVICE, O_RDONLY); 1305011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ion_fd < 0) { 1305111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Ion fd open failed : %d\n", ion_fd); 1305211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1305311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1305411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1305511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_custom_data *custom_data = (struct ion_custom_data*) malloc(sizeof(*custom_data)); 1305611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_prefetch_data *prefetch_data = (struct ion_prefetch_data*) malloc(sizeof(*prefetch_data)); 1305711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_prefetch_regions *regions = (struct ion_prefetch_regions*) malloc(sizeof(*regions)); 1305811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size_t *sizes = (size_t*) malloc(sizeof(size_t) * prefetch_count); 1305911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1306011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (custom_data == NULL || prefetch_data == NULL || regions == NULL || sizes == NULL) { 1306111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("prefetch data allocation failed"); 1306211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto prefetch_exit; 1306311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1306411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1306511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (uint32_t i = 0; i < prefetch_count; i++) { 1306611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizes[i] = prefetch_size; 1306711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1306811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1306911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel regions[0].nr_sizes = prefetch_count; 1307011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel regions[0].sizes = sizes; 1307111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel regions[0].vmid = ION_FLAG_CP_PIXEL; 1307211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1307311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prefetch_data->nr_regions = 1; 1307411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prefetch_data->regions = regions; 1307511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prefetch_data->heap_id = ION_HEAP(ION_SECURE_HEAP_ID); 1307611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1307711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel custom_data->cmd = ION_IOC_PREFETCH; 1307811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel custom_data->arg = (unsigned long )prefetch_data; 1307911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1308011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(ion_fd, ION_IOC_CUSTOM, custom_data); 1308111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 1308211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Custom prefetch ioctl failed rc : %d, errno : %d\n", rc, errno); 1308311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1308411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1308511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelprefetch_exit: 1308611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(ion_fd); 1308711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(sizes); 1308811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(regions); 1308911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(prefetch_data); 1309011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(custom_data); 1309111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1309211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 13093