omx_vdec_v4l2.cpp revision b50ee0d49e33884a5f998649944fff0a8e27cda6
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 15111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_U32 maxSmoothStreamingWidth = 1920; 15211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_U32 maxSmoothStreamingHeight = 1088; 15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* async_message_thread (void *input) 15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 15611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *buffer; 15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pollfd pfds[2]; 15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer v4l2_buf; 16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event dqevent; 16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec *omx = reinterpret_cast<omx_vdec*>(input); 16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfds[0].events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfds[1].events = POLLIN | POLLERR; 16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfds[0].fd = omx->drv_ctx.video_driver_fd; 16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfds[1].fd = omx->m_poll_efd; 16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0; 16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdec: Async thread start"); 16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0); 17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (!omx->async_thread_force_stop) { 17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = poll(pfds, 2, POLL_TIMEOUT); 17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!rc) { 17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Poll timedout"); 17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (rc < 0 && errno != EINTR && errno != EAGAIN) { 17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error while polling: %d, errno = %d", rc, errno); 17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pfds[1].revents & POLLIN) || (pfds[1].revents & POLLERR)) { 18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread interrupted to be exited"); 18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pfds[0].revents & POLLIN) || (pfds[0].revents & POLLRDNORM)) { 18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&vdec_msg, 0, sizeof(vdec_msg)); 18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.memory = V4L2_MEMORY_USERPTR; 18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.length = omx->drv_ctx.num_planes; 18911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.m.planes = plane; 19011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) { 19111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE; 19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf; 19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.len=plane[0].bytesused; 19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr; 19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) + 19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (uint64_t)v4l2_buf.timestamp.tv_usec; 19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 20211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 20311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 20411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 20511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pfds[0].revents & POLLOUT) || (pfds[0].revents & POLLWRNORM)) { 20611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 20711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 20811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.memory = V4L2_MEMORY_USERPTR; 20911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.length = 1; 21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.m.planes = plane; 21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) { 21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE; 21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf; 21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pfds[0].revents & POLLPRI) { 22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(pfds[0].fd, VIDIOC_DQEVENT, &dqevent); 22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) { 22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data; 22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED; 22811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 22911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.picsize.frame_height = ptr[0]; 23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.picsize.frame_width = ptr[1]; 23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDC Port Reconfig received insufficient"); 23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ptr[2] & V4L2_EVENT_BITDEPTH_FLAG) { 23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->dpb_bit_depth = ptr[3]; 23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDC Port Reconfig Bitdepth change - %d", ptr[3]); 23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ptr[2] & V4L2_EVENT_PICSTRUCT_FLAG) { 23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->m_progressive = ptr[4]; 23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDC Port Reconfig PicStruct change - %d", ptr[4]); 23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 24211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 24311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 24411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) { 24511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 24611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE; 24711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 24811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved"); 24911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 25311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE; 25411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 25511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved"); 25611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 25711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 25811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 25911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 26011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_OVERLOAD) { 26111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 26211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_EVT_HW_OVERLOAD; 26311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 26411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("HW Overload received"); 26511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 26611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 26711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 26811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 26911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED) { 27011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 27111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode=VDEC_MSG_EVT_HW_UNSUPPORTED; 27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code=VDEC_S_SUCCESS; 27311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("HW Unsupported received"); 27411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 27511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 27611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 27711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 27811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) { 27911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 28011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode = VDEC_MSG_EVT_HW_ERROR; 28111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code = VDEC_S_SUCCESS; 28211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("SYS Error Recieved"); 28311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 28411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exited"); 28511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 28611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 28711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE) { 28811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data; 28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 29011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("REFERENCE RELEASE EVENT RECVD fd = %d offset = %d", ptr[0], ptr[1]); 29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER) { 29211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data; 29311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo vdec_msg; 29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Release unqueued buffer event recvd fd = %d offset = %d", ptr[0], ptr[1]); 29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.memory = V4L2_MEMORY_USERPTR; 29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.length = omx->drv_ctx.num_planes; 30011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.m.planes = plane; 30111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.index = ptr[5]; 30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.flags = 0; 30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgcode = VDEC_MSG_RESP_OUTPUT_BUFFER_DONE; 30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.status_code = VDEC_S_SUCCESS; 30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.client_data = (void*)&v4l2_buf; 30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.len = 0; 30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.bufferaddr = (void*)(intptr_t)ptr[2]; 30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg.msgdata.output_frame.time_stamp = ((uint64_t)ptr[3] * (uint64_t)1000000) + 31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (uint64_t)ptr[4]; 31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdec_msg) < 0) { 31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread Exitedn"); 31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDC Some Event recieved"); 31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdec: Async thread stop"); 32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* message_thread_dec(void *input) 32611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 32711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec* omx = reinterpret_cast<omx_vdec*>(input); 32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char id; 32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int n; 33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd_set readFds; 33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int res = 0; 33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct timeval tv; 33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdec: message thread start"); 33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0); 33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (!omx->message_thread_stop) { 33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tv.tv_sec = 2; 34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tv.tv_usec = 0; 34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FD_ZERO(&readFds); 34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FD_SET(omx->m_pipe_in, &readFds); 34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel res = select(omx->m_pipe_in + 1, &readFds, NULL, NULL, &tv); 34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (res < 0) { 34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("select() ERROR: %s", strerror(errno)); 34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (res == 0 /*timeout*/ || omx->message_thread_stop) { 35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel n = read(omx->m_pipe_in, &id, 1); 35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == n) { 35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (1 == n) { 36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->process_event_cb(omx, id); 36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((n < 0) && (errno != EINTR)) { 36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno); 36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdec: message thread stop"); 36911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 37011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid post_message(omx_vdec *omx, unsigned char id) 37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret_value; 37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out); 37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret_value = write(omx->m_pipe_out, &id, 1); 37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret_value <= 0) { 37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("post_message to pipe failed : %s", strerror(errno)); 37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value); 38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx_cmd_queue destructor 38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_cmd_queue::~omx_cmd_queue() 38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 38711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Nothing to do 38811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 38911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 39011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue constructor 39111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0) 39211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE); 39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue insert 39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::omx_cmd_queue::insert_entry(unsigned long p1, unsigned long p2, unsigned long id) 39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) { 40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_q[m_write].id = id; 40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_q[m_write].param1 = p1; 40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_q[m_write].param2 = p2; 40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_write++; 40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_size ++; 40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) { 40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_write = 0; 40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__); 41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 41411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 41511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue pop 41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::omx_cmd_queue::pop_entry(unsigned long *p1, unsigned long *p2, unsigned long *id) 41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_size > 0) { 42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *id = m_q[m_read].id; 42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p1 = m_q[m_read].param1; 42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p2 = m_q[m_read].param2; 42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Move the read pointer ahead 42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ++m_read; 42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel --m_size; 42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) { 42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_read = 0; 42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Retrieve the first mesg type in the queue 43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned omx_vdec::omx_cmd_queue::get_q_msg_type() 43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return m_q[m_read].id; 44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 44111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 44211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 44311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::ts_arr_list::ts_arr_list() 44411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 44511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //initialize timestamps array 44611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) ); 44711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 44811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::ts_arr_list::~ts_arr_list() 44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //free m_ts_arr_list? 45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts) 45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool duplicate_ts = false; 45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int idx = 0; 45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //insert at the first available empty location 46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_ts_arr_list[idx].valid) { 46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //found invalid or empty entry, save timestamp 46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ts_arr_list[idx].valid = true; 46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ts_arr_list[idx].timestamp = ts; 46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)", 46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts, idx); 46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) { 47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert"); 47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 47811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts) 47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int min_idx = -1; 48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TICKS min_ts = 0; 48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int idx = 0; 48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 48611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 48711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_ts_arr_list[idx].valid) { 48811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //found valid entry, save index 48911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (min_idx < 0) { 49011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //first valid entry 49111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_ts = m_ts_arr_list[idx].timestamp; 49211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_idx = idx; 49311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_ts_arr_list[idx].timestamp < min_ts) { 49411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_ts = m_ts_arr_list[idx].timestamp; 49511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_idx = idx; 49611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 49711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 49811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 49911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (min_idx < 0) { 50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //no valid entries found 50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop"); 50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts = 0; 50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts = m_ts_arr_list[min_idx].timestamp; 50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ts_arr_list[min_idx].valid = false; 50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)", 51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts, min_idx); 51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::reset_ts_list() 51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int idx = 0; 52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list"); 52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) { 52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ts_arr_list[idx].valid = false; 52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// factory function executed by the core to create instances 53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid *get_omx_component_factory_fn(void) 53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return (new omx_vdec); 53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelVideoHeap::VideoHeap(int devicefd, size_t size, void* base, 54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_user_handle_t handle, int ionMapfd) 54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) devicefd; 54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) size; 54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) base; 54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) handle; 54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) ionMapfd; 54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd); 54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelVideoHeap::VideoHeap(int fd, size_t size, void* base) 55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // dup file descriptor, map once, use pmem 55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel init(dup(fd), base, size, 0 , MEM_DEVICE); 55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // _ANDROID_ 557b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 558b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelbool is_platform_tp10capture_supported() 559b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel{ 560b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel char platform_name[PROPERTY_VALUE_MAX] = {0}; 561b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel property_get("ro.board.platform", platform_name, "0"); 562b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (!strncmp(platform_name, "msmcobalt", 9)) { 563b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_HIGH("TP10 on capture port is supported"); 564b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return true; 565b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 566b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_HIGH("TP10 on capture port is not supported"); 567b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return false; 568b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel} 569b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 57011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 57111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 57211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::omx_vdec 57311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 57411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 57511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Constructor 57611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 57711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 57811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None 57911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 58011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 58111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 58211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 58311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_vdec(): m_error_propogated(false), 58411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state(OMX_StateInvalid), 58511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data(NULL), 58611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr(NULL), 58711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr(NULL), 58811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress (false), 58911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress (false), 59011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer (false), 59111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_use_buffer (false), 59211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ouput_egl_buffers(false), 59311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_output_pmem(OMX_FALSE), 59411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_region_smi(OMX_FALSE), 59511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_pvt_entry_pmem(OMX_FALSE), 59611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers(0), 59711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers(0), 59811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count(0), 59911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bm_count(0), 60011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bPopulated(OMX_FALSE), 60111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bPopulated(OMX_FALSE), 60211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_flags(0), 60311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 60411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_heap_ptr(NULL), 60511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bEnabled(OMX_TRUE), 60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bEnabled(OMX_TRUE), 60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_in_alloc_cnt(0), 60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list(NULL), 61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_entry(NULL), 61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info(NULL), 61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser(NULL), 61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes (true), 61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame (NULL), 61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame (NULL), 61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr (NULL), 61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr(NULL), 61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_heap_inp_bm_count (0), 61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse ((codec_type)0), 62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel first_frame_meta (true), 62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count (0), 62211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count (0), 62311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_length(0), 62411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal (false), 62511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel first_frame(0), 62611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel first_buffer(NULL), 62711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel first_frame_size (0), 62811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_device_file_ptr(NULL), 62911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_vc1_profile((vc1_profile_type)0), 63011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts(LLONG_MAX), 63111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_flags(0), 63211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disp_hor_size(0), 63311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disp_vert_size(0), 63411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts(LLONG_MAX), 63511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts_actual(LLONG_MAX), 63611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts(true), 63711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int(0), 638fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_fps_received(0), 639fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_fps_prev(0), 640fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_drc_enable(0), 64111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel in_reconfig(false), 64211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_display_id(NULL), 64311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata(0), 64411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_reject_avc_1080p_mp (0), 64511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_enable_android_native_buffers(OMX_FALSE), 64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_android_native_buffers(OMX_FALSE), 64811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 64911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_desc_buffer_ptr(NULL), 65011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode(false), 65111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocate_native_handle(false), 65211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_other_extradata(NULL), 65311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile(0), 65411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_set_fps(false), 65511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stereo_output_mode(HAL_NO_3D), 65611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_last_rendered_TS(-1), 65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queued_codec_config_count(0), 65811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel current_perf_level(V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL), 65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_scaling_to_non_secure_opb(false), 660b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel m_force_compressed_for_dpb(true), 66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_is_display_session(false) 66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_in = -1; 66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_out = -1; 66511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_poll_efd = -1; 66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_driver_fd = -1; 66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.ion.fd_ion_data.fd = -1; 66811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Assumption is that , to begin with , we have all the frames with decoder */ 66911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("In %u bit OMX vdec Constructor", (unsigned int)sizeof(long) * 8); 67011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_debug,0,sizeof(m_debug)); 67111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 67211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char property_value[PROPERTY_VALUE_MAX] = {0}; 67311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.debug.level", property_value, "1"); 674b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel debug_level = strtoul(property_value, NULL, 16); 67511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 67611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 67711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("In OMX vdec Constructor"); 67811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 67911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.perf", property_value, "0"); 68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel perf_flag = atoi(property_value); 68111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (perf_flag) { 68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag); 68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec_time.start(); 68411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 685fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel proc_frms = latency = 0; 68611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_n_filled_len = 0; 68711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 68811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.ts", property_value, "0"); 68911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug_timestamp = atoi(property_value); 69011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp); 69111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_timestamp) { 69211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.set_timestamp_reorder_mode(true); 69311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.enable_debug_print(true); 69411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 69511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 69611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 69711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.concealedmb", property_value, "0"); 69811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug_concealedmb = atoi(property_value); 69911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb); 70011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 70111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 70211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.profile.check", property_value, "0"); 70311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_reject_avc_1080p_mp = atoi(property_value); 70411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("vidc.dec.profile.check value is %d",m_reject_avc_1080p_mp); 70511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 70611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 70711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.log.in", property_value, "0"); 70811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.in_buffer_log = atoi(property_value); 70911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 71011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 71111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.log.out", property_value, "0"); 71211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_buffer_log = atoi(property_value); 71311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC); 71411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 71511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 71611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.meta.log.out", property_value, "0"); 71711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_meta_buffer_log = atoi(property_value); 71811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC); 71911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 72111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.log.loc", property_value, ""); 72211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*property_value) 72311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(m_debug.log_loc, property_value, PROPERTY_VALUE_MAX); 72411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 72611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.120fps.enabled", property_value, "0"); 72711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //if this feature is not enabled then reset this value -ve 72911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(atoi(property_value)) { 73011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("feature 120 FPS decode enabled"); 73111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_last_rendered_TS = 0; 73211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 73311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 73511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.dyn.disabled", property_value, "0"); 73611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disable_dynamic_buf_mode = atoi(property_value); 73711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("vidc.dec.debug.dyn.disabled value is %d",m_disable_dynamic_buf_mode); 73811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 739fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel property_value[0] = '\0'; 740fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel property_get("vidc.dec.drc.enable", property_value, "0"); 741fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (atoi(property_value)) { 742fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_drc_enable = true; 743fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_HIGH("DRC enabled"); 744fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 745fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 74611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _UBWC_ 74711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value[0] = '\0'; 74811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("debug.gralloc.gfx_ubwc_disable", property_value, "0"); 74911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disable_ubwc_mode = atoi(property_value); 75011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("UBWC mode is %s", m_disable_ubwc_mode ? "disabled" : "enabled"); 75111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 75211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disable_ubwc_mode = true; 75311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 75411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 75511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_cmp,0,sizeof(m_cmp)); 75611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_cb,0,sizeof(m_cb)); 75711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset (&drv_ctx,0,sizeof(drv_ctx)); 75811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE)); 75911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset (m_hwdevice_name,0,sizeof(m_hwdevice_name)); 76011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 76111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_custom_buffersize, 0, sizeof(m_custom_buffersize)); 762fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset(&m_client_color_space, 0, sizeof(DescribeColorAspectsParams)); 763fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset(&m_internal_color_space, 0, sizeof(DescribeColorAspectsParams)); 764fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel memset(&m_client_hdr_info, 0, sizeof(DescribeHDRStaticInfoParams)); 765fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel memset(&m_internal_hdr_info, 0, sizeof(DescribeHDRStaticInfoParams)); 76611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_entries = 0; 76711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_id = 0; 76811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_id = 0; 76911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_created = false; 77011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_created = false; 77111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_force_stop = false; 77211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel message_thread_stop = false; 77311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 77411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 77511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 77611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info)); 77711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 77811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* invalidate m_frame_pack_arrangement */ 77911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_frame_pack_arrangement, 0, sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT)); 78011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_pack_arrangement.cancel_flag = 1; 78111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 78211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.timestamp_adjust = false; 78311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_vendor_config.pData = NULL; 78411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(&m_lock, NULL); 78511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(&c_lock, NULL); 78611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(&buf_lock, NULL); 78711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_init(&m_cmd_lock,0,0); 78811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_init(&m_safe_flush, 0, 0); 78911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = 79011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[OUTPUT_PORT] = false; 79111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 79211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char extradata_value[PROPERTY_VALUE_MAX] = {0}; 79311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.extradata", extradata_value, "0"); 79411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug_extradata = atoi(extradata_value); 79511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata); 79611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 79711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB; 79811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_buffers.set_vdec_client(this); 79911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dynamic_buf_mode = false; 80011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list = NULL; 80111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_down_scalar_enabled = false; 80211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_width = 0; 80311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_height = 0; 80411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_force_down_scalar = 0; 80511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_reconfig_height = 0; 80611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_reconfig_width = 0; 80711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_mode = false; 80811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_width = 0; 80911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_height = 0; 81011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_q6_platform = false; 81111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_control.send_hint_to_mpctl(true); 81211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pass_buffer_fd = false; 81311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_extradata_info, 0, sizeof(m_extradata_info)); 814fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_client_color_space.nPortIndex = (OMX_U32)OMX_CORE_INPUT_PORT_INDEX; 815fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_client_color_space.sAspects.mRange = ColorAspects::RangeUnspecified; 816fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_client_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified; 817fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_client_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified; 818fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_client_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified; 819fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 820fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX; 821fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mRange = ColorAspects::RangeUnspecified; 822fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified; 823fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified; 824fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified; 825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.nSize = sizeof(DescribeColorAspectsParams); 826fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 827fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_client_hdr_info.nPortIndex = (OMX_U32)OMX_CORE_INPUT_PORT_INDEX; 828fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_internal_hdr_info.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX; 829fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_change_client_hdr_info = false; 830fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel pthread_mutex_init(&m_hdr_info_client_lock, NULL); 831b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel m_dither_config = is_platform_tp10capture_supported() ? DITHER_DISABLE : DITHER_ALL_COLORSPACE; 832b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel m_color_space = EXCEPT_BT2020; 83311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 83411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 83511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const int event_type[] = { 83611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_FLUSH_DONE, 83711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT, 83811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT, 83911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_BITDEPTH_CHANGED_INSUFFICIENT, 84011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE, 84111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER, 84211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_SYS_ERROR, 84311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_HW_OVERLOAD, 84411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED 84511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}; 84611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 84711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE subscribe_to_events(int fd) 84811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 84911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 85011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event_subscription sub; 85111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int array_sz = sizeof(event_type)/sizeof(int); 85211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int i,rc; 85311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 85411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid input: %d", fd); 85511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 85611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 85711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 85811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < array_sz; ++i) { 85911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sub, 0, sizeof(sub)); 86011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sub.type = event_type[i]; 86111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 86211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 86311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type); 86411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 86511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 86611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 86711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < array_sz) { 86811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (--i; i >=0 ; i--) { 86911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sub, 0, sizeof(sub)); 87011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sub.type = event_type[i]; 87111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 87211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 87311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 87411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 87511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNotImplemented; 87611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 87711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 87811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE unsubscribe_to_events(int fd) 88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event_subscription sub; 88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int array_sz = sizeof(event_type)/sizeof(int); 88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int i,rc; 88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid input: %d", fd); 88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < array_sz; ++i) { 89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sub, 0, sizeof(sub)); 89411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sub.type = event_type[i]; 89511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 89611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 89711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 89811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 89911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 90011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 90111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 90211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 90311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 90411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::~omx_vdec 90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Destructor 91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None 91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::~omx_vdec() 91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info = NULL; 92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("In OMX vdec Destructor"); 92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (msg_thread_created) { 92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Signalling close to OMX Msg Thread"); 92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel message_thread_stop = true; 92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_message(this, OMX_COMPONENT_CLOSE_MSG); 92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit"); 92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_join(msg_thread_id,NULL); 92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_pipe_in); 92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_pipe_out); 93011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_in = -1; 93111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_out = -1; 93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit"); 93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eventfd_write(m_poll_efd, 1)) { 93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("eventfd_write failed for fd: %d, errno = %d, force stop async_thread", m_poll_efd, errno); 93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_force_stop = true; 93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (async_thread_created) 93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_join(async_thread_id,NULL); 94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsubscribe_to_events(drv_ctx.video_driver_fd); 94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_poll_efd); 94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.video_driver_fd); 94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_destroy(&m_lock); 94411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_destroy(&c_lock); 94511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_destroy(&buf_lock); 94611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_destroy(&m_cmd_lock); 947fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel pthread_mutex_destroy(&m_hdr_info_client_lock); 94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (perf_flag) { 94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME"); 95011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec_time.end(); 95111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 95211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("Exit OMX vdec Destructor: fd=%d",drv_ctx.video_driver_fd); 95311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_control.send_hint_to_mpctl(false); 95411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 95511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 95611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type) 95711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 95811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 95911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 96011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 96111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 96211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 0; 96311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 96411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 96511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(buffer_type == VDEC_BUFFER_TYPE_INPUT) { 96611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 96711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 0; 96811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 96911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 97011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 97111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 97211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 97311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 97411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_dpb(bool is_split_mode, int dpb_color_format) 97511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 97611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 97711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_control ctrl[2]; 97811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_controls controls; 97911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 98011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("DPB mode: %s DPB color format: %s OPB color format: %s", 98111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_split_mode ? "split" : "combined", 98211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC ? "nv12_ubwc": 98311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC ? "nv12_10bit_ubwc": 98411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE ? "same as opb": 98511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "unknown", 98611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capture_capability == V4L2_PIX_FMT_NV12 ? "nv12": 98711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capture_capability == V4L2_PIX_FMT_NV12_UBWC ? "nv12_ubwc": 988b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel capture_capability == V4L2_PIX_FMT_NV12_TP10_UBWC ? "nv12_10bit_ubwc": 98911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "unknown"); 99011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 99111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_MODE; 99211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_split_mode) { 99311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_SECONDARY; 99411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 99511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_PRIMARY; 99611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 99711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 99811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_DPB_COLOR_FORMAT; 99911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].value = dpb_color_format; 100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.count = 2; 100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.ctrl_class = V4L2_CTRL_CLASS_MPEG; 100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls = ctrl; 100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_EXT_CTRLS, &controls); 100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set ext ctrls for opb_dpb: %d\n", rc); 100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1014b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry StrudelOMX_ERRORTYPE omx_vdec::decide_dpb_buffer_mode(bool split_opb_dpb_with_same_color_fmt) 101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 1019b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool cpu_access = (capture_capability != V4L2_PIX_FMT_NV12_UBWC) && 1020b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel capture_capability != V4L2_PIX_FMT_NV12_TP10_UBWC; 1021b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool tp10_enable = !cpu_access && 1022b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10; 1023b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool dither_enable = true; 1024b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 1025b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel switch (m_dither_config) { 1026b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel case DITHER_DISABLE: 1027b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel dither_enable = false; 1028b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel break; 1029b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel case DITHER_COLORSPACE_EXCEPTBT2020: 1030b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel dither_enable = (m_color_space == EXCEPT_BT2020); 1031b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel break; 1032b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel case DITHER_ALL_COLORSPACE: 1033b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel dither_enable = true; 1034b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel break; 1035b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel default: 1036b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_ERROR("Unsupported dither configuration:%d", m_dither_config); 1037b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1038b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 1039b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (tp10_enable && !dither_enable) { 1040b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_TP10_UBWC; 1041b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel capture_capability = V4L2_PIX_FMT_NV12_TP10_UBWC; 1042b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 1043b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 1044b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1045b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 1046b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (rc) { 1047b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_ERROR("%s: Failed get format on capture mplane", __func__); 1048b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return OMX_ErrorUnsupportedSetting; 1049b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1050b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 1051b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 1052b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (rc) { 1053b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_ERROR("%s: Failed set format on capture mplane", __func__); 1054b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return OMX_ErrorUnsupportedSetting; 1055b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1056b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 1057b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1058b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 105911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 106011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_IDLE_PENDING) && 106111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 106211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Invalid state to decide on dpb-opb split"); 106311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 106411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 106511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 106611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 106711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cpu_access) { 106811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) { 106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Disabled split mode for VP9. In split mode the DPB buffers are part of the internal 107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * scratch buffers and the driver does not does the reference buffer management for 107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * scratch buffers. In case of VP9 with spatial scalability, when a sequence changed 107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * event is received with the new resolution, and when a flush is sent by the driver, it 107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * releases all the references of internal scratch buffers. However as per the VP9 107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * spatial scalability, even after the flush, the buffers which have not yet received 107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * release reference event should not be unmapped and freed. Currently in driver, 107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * reference buffer management of the internal scratch buffer is not implemented 107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * and hence the DPB buffers get unmapped. For other codecs it does not matter 107811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * as with the new SPS/PPS, the DPB is flushed. 107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 1080b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool is_not_vp9 = eCompressionFormat != OMX_VIDEO_CodingVP9; 1081b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool eligible_for_split_dpb_ubwc = 1082b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel m_progressive == MSM_VIDC_PIC_STRUCT_PROGRESSIVE && //@ Due to Venus limitation for Interlaced, Split mode enabled only for Progressive. 1083b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel is_not_vp9 && //@ Split mode disabled for VP9. 1084b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel !drv_ctx.idr_only_decoding && //@ Split mode disabled for Thumbnail usecase. 1085b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel !m_disable_split_mode; //@ Set prop to disable split mode 1086b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 1087b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel //Since opb is linear, dpb should also be linear. 1088b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (split_opb_dpb_with_same_color_fmt) { 1089b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel eligible_for_split_dpb_ubwc = false; 1090b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1091b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 1092b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (eligible_for_split_dpb_ubwc) { 109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //split DPB-OPB 109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DPB -> UBWC , OPB -> Linear 109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC); 1096b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (split_opb_dpb_with_same_color_fmt) { 109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DPB -> Linear, OPB -> Linear 109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE); 109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DPB-OPB combined linear 110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE); 110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) { 110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //split DPB-OPB 110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DPB -> UBWC, OPB -> Linear 110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC); 110711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 110811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { //no cpu access 110911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) { 1110b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (split_opb_dpb_with_same_color_fmt) { 111111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //split DPB-OPB 111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DPB -> UBWC, OPB -> UBWC 111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC); 111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DPB-OPB combined UBWC 111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE); 111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) { 1119b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (dither_enable) { 1120b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel //split DPB-OPB 1121b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel //DPB -> TP10UBWC, OPB -> UBWC 1122b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC); 1123b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else { 1124b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel //combined DPB-OPB 1125b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel //DPB -> TP10UBWC, OPB -> TP10UBWC 1126b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC); 1127b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 112911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 113011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet) { 113111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set DPB buffer mode: %d", eRet); 113211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1134b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::enable_downscalar() 114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 114211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 114311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 114411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 114511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_down_scalar_enabled) { 114611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s: already enabled", __func__); 114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdec::enable_downscalar"); 115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = decide_dpb_buffer_mode(true); 115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: decide_dpb_buffer_mode Failed ", __func__); 115411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_down_scalar_enabled = true; 115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&control, 0x0, sizeof(struct v4l2_control)); 115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_KEEP_ASPECT_RATIO; 116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: Failed to set VIDEO_KEEP_ASPECT_RATIO", __func__); 116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 116811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 116911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 117011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::disable_downscalar() 117111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 117211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 117311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 117411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 117511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!is_down_scalar_enabled) { 117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdec::disable_downscalar: already disabled"); 117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = decide_dpb_buffer_mode(false); 118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s:decide_dpb_buffer_mode failed\n", __func__); 118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 118511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_down_scalar_enabled = false; 118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::decide_downscalar() 119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 119311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 119411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum color_fmts color_format; 11952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_U32 width, height; 119611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1197b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (capture_capability == V4L2_PIX_FMT_NV12_TP10_UBWC) { 1198b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel rc = disable_downscalar(); 1199b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (rc) { 1200b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_ERROR("Disable downscalar failed!"); 1201b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return rc; 1202b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1203b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return 0; 1204b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 1205b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_downscalar_width || !m_downscalar_height) { 120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s: downscalar not supported", __func__); 120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_force_down_scalar) { 121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s: m_force_down_scalar %d ", __func__, m_force_down_scalar); 121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__); 122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel height = fmt.fmt.pix_mp.height; 12262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel width = fmt.fmt.pix_mp.width; 12272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("%s: driver wxh = %dx%d, downscalar wxh = %dx%d m_is_display_session = %d", __func__, 122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, m_downscalar_width, m_downscalar_height, m_is_display_session); 123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12312601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if ((fmt.fmt.pix_mp.width * fmt.fmt.pix_mp.height >= m_downscalar_width * m_downscalar_height) && 123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_is_display_session) { 123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = enable_downscalar(); 123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__); 123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 123811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel width = m_downscalar_width > fmt.fmt.pix_mp.width ? 124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width : m_downscalar_width; 12412601808ee2992a94c325d05e4065aba60b01840bThierry Strudel height = m_downscalar_height > fmt.fmt.pix_mp.height ? 124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height : m_downscalar_height; 124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (capture_capability) { 124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_NV12: 124511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = COLOR_FMT_NV12; 124611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 124711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_NV12_UBWC: 124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = COLOR_FMT_NV12_UBWC; 124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_NV12_TP10_UBWC: 125111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = COLOR_FMT_NV12_BPP10_UBWC; 125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Color format not recognized\n"); 125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = OMX_ErrorUndefined; 125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 125911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = disable_downscalar(); 126111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__); 126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 12692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.height = height; 12702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.width = width; 127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: Failed set format on capture mplane", __func__); 127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = get_buffer_req(&drv_ctx.op_buf); 127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: Failed to get output buffer requirements", __func__); 128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::OMXCntrlProcessMsgCb 129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel IL Client callbacks are generated through this routine. The decoder 129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel provides the thread context for this routine. 129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctxt -- Context information related to the self. 129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id -- Event identifier. This could be any of the following: 129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1. Command completion event 129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2. Buffer done callback event 130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3. Frame done callback event 130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id) 130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1; // Parameter - 1 130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2; // Parameter - 2 131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident; 131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned qsize=0; // qsize 131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec *pThis = (omx_vdec *) ctxt; 131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis) { 131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out", 131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel __func__); 131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Protect the shared queue data structure 132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel do { 132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Read the message id's from the queue*/ 132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&pThis->m_lock); 132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_cmd_q.m_size; 132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize) { 132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cmd_q.pop_entry(&p1, &p2, &ident); 132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize == 0 && pThis->m_state != OMX_StatePause) { 133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_ftb_q.m_size; 133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize) { 133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_ftb_q.pop_entry(&p1, &p2, &ident); 133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize == 0 && pThis->m_state != OMX_StatePause) { 133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_etb_q.m_size; 133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize) { 133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_etb_q.pop_entry(&p1, &p2, &ident); 134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&pThis->m_lock); 134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*process message if we have one*/ 134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize > 0) { 134611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id = ident; 134711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (id) { 134811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EVENT: 134911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (p1) { 135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandStateSet: 135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = (OMX_STATETYPE) p2; 135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d", 135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state); 135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL); 135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_EventError: 136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == OMX_StateInvalid) { 136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid"); 136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = (OMX_STATETYPE) p2; 136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventError, OMX_ErrorInvalidState, p2, NULL); 136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (p2 == (unsigned long)OMX_ErrorHardware) { 136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error(); 136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventError, p2, (OMX_U32)NULL, NULL ); 137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortDisable: 137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%lu]", p2); 137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == OMX_CORE_OUTPUT_PORT_INDEX) { 138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT)) 138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to release output buffers"); 138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf); 138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->in_reconfig = false; 138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error(); 139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL ); 139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortEnable: 139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%lu]", p2); 139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ 139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL ); 140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL ); 140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_ETB_ARBITRARY: 141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\ 141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) { 141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure"); 141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_ETB: { 142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE iret; 142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel iret = pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1, (OMX_BUFFERHEADERTYPE *)p2); 142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (iret == OMX_ErrorInsufficientResources) { 142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure due to HW overload"); 142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_hw_overload (); 142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (iret != OMX_ErrorNone) { 142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure"); 142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_FTB: 143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)(intptr_t)p1,\ 143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) { 143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure"); 143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 144011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_COMMAND: 144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\ 144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_U32)p2,(OMX_PTR)NULL); 144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EBD: 144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) { 144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure"); 144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) { 145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->time_stamp_dts.remove_time_stamp( 145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((OMX_BUFFERHEADERTYPE *)(intptr_t)p1)->nTimeStamp, 145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ?true:false); 145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( pThis->empty_buffer_done(&pThis->m_cmp, 145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone) { 146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_buffer_done failure"); 146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: { 146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int64_t *timestamp = (int64_t *)(intptr_t)p1; 146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p1) { 146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->time_stamp_dts.remove_time_stamp(*timestamp, 146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ?true:false); 147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(timestamp); 147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_FBD: 147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure"); 147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ( pThis->fill_buffer_done(&pThis->m_cmp, 148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone ) { 148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("fill_buffer_done failure"); 148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH: 148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Driver flush i/p Port complete"); 148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->input_flush_progress) { 148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver"); 149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->execute_input_flush(); 149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure"); 149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if we need generate event for Flush done*/ 149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_INPUT_FLUSH_PENDING)) { 150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING); 150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Input Flush completed - Notify Client"); 150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandFlush, 150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX,NULL ); 150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_IDLE_PENDING)) { 150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) { 150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port"); 151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->streaming[OUTPUT_PORT] = false; 151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->output_flush_progress) { 151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Input flush done hence issue stop"); 151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_STOP_DONE); 151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH: 152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Driver flush o/p Port complete"); 152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->output_flush_progress) { 153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver"); 153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->execute_output_flush(); 153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed"); 153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if we need generate event for Flush done*/ 153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) { 154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Notify Output Flush done"); 154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandFlush, 154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX,NULL ); 154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) { 154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Internal flush complete"); 155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags, 155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) { 155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->post_event(OMX_CommandPortDisable, 155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, 155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags, 155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags, 156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) { 156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) { 156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port"); 156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->streaming[CAPTURE_PORT] = false; 157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->input_flush_progress) { 157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Output flush done hence issue stop"); 157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\ 157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_STOP_DONE); 157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_START_DONE: 158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE"); 158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure"); 159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success"); 159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Move to executing"); 159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StateExecuting; 159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateExecuting, NULL); 160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (BITMASK_PRESENT(&pThis->m_flags, 160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_PAUSE_PENDING)) { 160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (/*ioctl (pThis->drv_ctx.video_driver_fd, 160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) { 160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed"); 160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Event Handler callback is NULL"); 161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_PAUSE_DONE: 161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE"); 161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed"); 162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->complete_pending_buffer_done_cbs(); 162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) { 162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity"); 162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Send the callback now 162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING); 162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StatePause; 162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StatePause, NULL); 163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_RESUME_DONE: 164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE"); 164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed"); 164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Moving the decoder to execute state"); 164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StateExecuting; 165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateExecuting,NULL); 165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_STOP_DONE: 166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE"); 166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDEC_S_SUCCESS) { 166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed"); 166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->complete_pending_buffer_done_cbs(); 167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) { 167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success"); 167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING); 167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StateIdle; 167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Move to Idle State"); 167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data, 167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateIdle,NULL); 168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == OMX_IndexParamPortDefinition) { 169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexParamPortDefinition"); 169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->in_reconfig = true; 169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (p2 == OMX_IndexConfigCommonOutputCrop) { 169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexConfigCommonOutputCrop"); 169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Check if resolution is changed in smooth streaming mode */ 169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_smoothstreaming_mode && 169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (pThis->framesize.nWidth != 169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width) || 169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (pThis->framesize.nHeight != 170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height)) { 170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Resolution changed from: wxh = %dx%d to: wxh = %dx%d", 170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->framesize.nWidth, 170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->framesize.nHeight, 170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width, 170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height); 170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Update new resolution */ 170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->framesize.nWidth = 171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width; 171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->framesize.nHeight = 171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height; 171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Update C2D with new resolution */ 171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->client_buffers.update_buffer_req()) { 171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting C2D buffer requirements failed"); 171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Update new crop information */ 172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nLeft = pThis->drv_ctx.frame_size.left; 172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nTop = pThis->drv_ctx.frame_size.top; 172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nWidth = pThis->drv_ctx.frame_size.right; 172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nHeight = pThis->drv_ctx.frame_size.bottom; 172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Validate the new crop information */ 172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->rectangle.nLeft + pThis->rectangle.nWidth > 172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width) { 172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Crop L[%u] + R[%u] > W[%u]", 173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nLeft, pThis->rectangle.nWidth, 173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width); 173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nLeft = 0; 173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->rectangle.nWidth > 173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width) { 173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Crop R[%u] > W[%u]", 173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nWidth, 174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width); 174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nWidth = 174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_width; 174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->rectangle.nTop + pThis->rectangle.nHeight > 174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height) { 174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Crop T[%u] + B[%u] > H[%u]", 174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nTop, pThis->rectangle.nHeight, 175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height); 175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nTop = 0; 175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->rectangle.nHeight > 175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height) { 175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Crop B[%u] > H[%u]", 175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nHeight, 175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height); 175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nHeight = 176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->drv_ctx.video_resolution.frame_height; 176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Updated Crop Info: L: %u, T: %u, R: %u, B: %u", 176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nLeft, pThis->rectangle.nTop, 176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rectangle.nWidth, pThis->rectangle.nHeight); 1766fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (p2 == OMX_QTIIndexConfigDescribeColorAspects) { 1767fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeColorAspects"); 1768fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } else if (p2 == OMX_QTIIndexConfigDescribeHDRColorInfo) { 1769fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeHDRcolorinfo"); 177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Rxd Invalid PORT_RECONFIG event (%lu)", p2); 177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_debug.outfile) { 177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(pThis->m_debug.outfile); 177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_debug.outfile = NULL; 177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_debug.out_ymeta_file) { 177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(pThis->m_debug.out_ymeta_file); 178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_debug.out_ymeta_file = NULL; 178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_debug.out_uvmeta_file) { 178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(pThis->m_debug.out_uvmeta_file); 178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_debug.out_uvmeta_file = NULL; 178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->secure_mode && pThis->m_cb.EventHandler && pThis->in_reconfig) { 178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->prefetchNewBuffers(); 178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t frame_data[4]; 179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_data[0] = (p2 == OMX_IndexParamPortDefinition) ? 179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_reconfig_height : pThis->rectangle.nHeight; 179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_data[1] = (p2 == OMX_IndexParamPortDefinition) ? 179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_reconfig_width : pThis->rectangle.nWidth; 179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_data[2] = (p2 == OMX_IndexParamPortDefinition) ? 179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_data[0] : pThis->drv_ctx.video_resolution.frame_height; 180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_data[3] = (p2 == OMX_IndexParamPortDefinition) ? 180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_data[1] : pThis->drv_ctx.video_resolution.frame_width; 180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventPortSettingsChanged, p1, p2, (void*) frame_data ); 180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EOS_DONE: 181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE"); 181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag, 181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL ); 181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->prev_ts = LLONG_MAX; 182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rst_prev_ts = true; 182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR"); 182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error(); 182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING: 182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING"); 183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_unsupported_setting(); 183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD: 183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD"); 183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_hw_overload(); 183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&pThis->m_lock); 184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_cmd_q.m_size; 184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_state != OMX_StatePause) 184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size); 184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&pThis->m_lock); 184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } while (qsize>0); 184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::update_resolution(int width, int height, int stride, int scan_lines) 185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int format_changed = 0; 185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((height != (int)drv_ctx.video_resolution.frame_height) || 185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (width != (int)drv_ctx.video_resolution.frame_width)) { 185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)", 185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel width, drv_ctx.video_resolution.frame_width, 185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel height,drv_ctx.video_resolution.frame_height); 185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel format_changed = 1; 186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height = height; 186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width = width; 186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.scan_lines = scan_lines; 186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.stride = stride; 1865fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 1866fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (!is_down_scalar_enabled) { 1867fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel rectangle.nLeft = m_extradata_info.output_crop_rect.nLeft; 1868fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel rectangle.nTop = m_extradata_info.output_crop_rect.nTop; 1869fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel rectangle.nWidth = m_extradata_info.output_crop_rect.nWidth; 1870fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel rectangle.nHeight = m_extradata_info.output_crop_rect.nHeight; 187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return format_changed; 187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::is_video_session_supported() 187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", 187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE) && 187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_profile == HIGH_PROFILE || m_profile == MAIN_PROFILE)) { 188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_width = 1280; 188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_height = 720; 188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set max_width=1280 & max_height=720 for H264 HP/MP"); 188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((drv_ctx.video_resolution.frame_width * 188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height > 188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_width * 188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_height) || 188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.video_resolution.frame_width* 189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height < 189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_width * 189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_height)) { 189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR( 189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)", 189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width, 189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height, 189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_width, 189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_height, 189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_width, 190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_height); 190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("video session supported"); 190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::log_input_buffers(const char *buffer_addr, int buffer_len) 190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.in_buffer_log && !m_debug.infile) { 191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) { 191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.m4v", 191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) { 191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.mpg", m_debug.log_loc, 191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) { 191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.263", 191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE) || 192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.264", 192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.265", 192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) { 192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1", 192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE)) { 193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1", 193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) { 193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf", 193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { 193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf", 193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.divx", 194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.infile = fopen (m_debug.infile_name, "ab"); 194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug.infile) { 194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile_name); 194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.infile_name[0] = '\0'; 194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) || 194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { 195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ivf_file_header { 195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 signature[4]; //='DKIF'; 195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 version ; //= 0; 195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 headersize ; //= 32; 195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 FourCC; 195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 width; 195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 height; 195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 rate; 195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 scale; 195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 length; 196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 unused[4]; 196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } file_header; 196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&file_header,0,sizeof(file_header)); 196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.signature[0] = 'D'; 196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.signature[1] = 'K'; 196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.signature[2] = 'I'; 196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.signature[3] = 'F'; 196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.version = 0; 196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.headersize = 32; 197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (drv_ctx.decoder_format) { 197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_CODECTYPE_VP8: 197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.FourCC = 0x30385056; 197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_CODECTYPE_VP9: 197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel file_header.FourCC = 0x30395056; 197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("unsupported format for VP8/VP9"); 197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite((const char *)&file_header, 198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(file_header),1,m_debug.infile); 198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.infile && buffer_addr && buffer_len) { 198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) || 198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { 198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vpx_ivf_frame_header { 198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 framesize; 199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 timestamp_lo; 199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 timestamp_hi; 199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } vpx_frame_header; 199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vpx_frame_header.framesize = buffer_len; 199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Currently FW doesn't use timestamp values */ 199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vpx_frame_header.timestamp_lo = 0; 199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vpx_frame_header.timestamp_hi = 0; 199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite((const char *)&vpx_frame_header, 199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(vpx_frame_header),1,m_debug.infile); 199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite(buffer_addr, buffer_len, 1, m_debug.infile); 200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::log_output_buffers(OMX_BUFFERHEADERTYPE *buffer) { 200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int buf_index = 0; 200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char *temp = NULL; 200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.out_buffer_log && !m_debug.outfile && buffer->nFilledLen) { 201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.outfile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.yuv", 201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.outfile = fopen (m_debug.outfile_name, "ab"); 201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug.outfile) { 201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to open output file: %s for logging", m_debug.log_loc); 201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.outfile_name[0] = '\0'; 201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.out_meta_buffer_log && !m_debug.out_ymeta_file && !m_debug.out_uvmeta_file 202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && buffer->nFilledLen) { 202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.out_ymetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.ymeta", 202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.out_uvmetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.uvmeta", 202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this); 202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_ymeta_file = fopen (m_debug.out_ymetafile_name, "ab"); 202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_uvmeta_file = fopen (m_debug.out_uvmetafile_name, "ab"); 202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug.out_ymeta_file || !m_debug.out_uvmeta_file) { 202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to open output y/uv meta file: %s for logging", m_debug.log_loc); 203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_ymetafile_name[0] = '\0'; 203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_uvmetafile_name[0] = '\0'; 203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((!m_debug.outfile && !m_debug.out_ymeta_file) || !buffer || !buffer->nFilledLen) 203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_index = buffer - m_out_mem_ptr; 204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr; 204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2042b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC || 2043b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) { 204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Logging UBWC yuv width/height(%u/%u)", 204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width, 204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height); 204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.outfile) 204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite(temp, buffer->nFilledLen, 1, m_debug.outfile); 205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.out_ymeta_file && m_debug.out_uvmeta_file) { 205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int width = 0, height = 0; 205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int y_plane, y_meta_plane; 205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int y_stride = 0, y_sclines = 0; 205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int y_meta_stride = 0, y_meta_scanlines = 0, uv_meta_stride = 0, uv_meta_scanlines = 0; 2056b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel int color_fmt = (drv_ctx.output_format== VDEC_YUV_FORMAT_NV12_UBWC)? COLOR_FMT_NV12_UBWC: COLOR_FMT_NV12_BPP10_UBWC; 205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int i; 205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int bytes_written = 0; 205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel width = drv_ctx.video_resolution.frame_width; 206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel height = drv_ctx.video_resolution.frame_height; 206211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width); 206311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height); 206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_stride = VENUS_Y_STRIDE(color_fmt, width); 206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_sclines = VENUS_Y_SCANLINES(color_fmt, height); 206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width); 206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height); 206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_meta_plane = MSM_MEDIA_ALIGN(y_meta_stride * y_meta_scanlines, 4096); 207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096); 207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr; 207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < y_meta_scanlines; i++) { 207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes_written = fwrite(temp, y_meta_stride, 1, m_debug.out_ymeta_file); 207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp += y_meta_stride; 207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + y_meta_plane + y_plane; 207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i = 0; i < uv_meta_scanlines; i++) { 208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes_written += fwrite(temp, uv_meta_stride, 1, m_debug.out_uvmeta_file); 208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp += uv_meta_stride; 208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 2084b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) { 208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int stride = drv_ctx.video_resolution.stride; 208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int scanlines = drv_ctx.video_resolution.scan_lines; 208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_smoothstreaming_mode) { 208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = drv_ctx.video_resolution.frame_width; 208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel scanlines = drv_ctx.video_resolution.frame_height; 209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = (stride + DEFAULT_WIDTH_ALIGNMENT - 1) & (~(DEFAULT_WIDTH_ALIGNMENT - 1)); 209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel scanlines = (scanlines + DEFAULT_HEIGHT_ALIGNMENT - 1) & (~(DEFAULT_HEIGHT_ALIGNMENT - 1)); 209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i; 209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Logging width/height(%u/%u) stride/scanlines(%u/%u)", 209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width, 209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height, stride, scanlines); 209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int bytes_written = 0; 209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) { 209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile); 210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp += stride; 210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines; 210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int stride_c = stride; 210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) { 210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile); 210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp += stride_c; 210711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ComponentInit 211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Initialize the component. 211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 212011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctxt -- Context information related to the self. 212111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id -- Event identifier. This could be any of the following: 212211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1. Command completion event 212311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2. Buffer done callback event 212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3. Frame done callback event 212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role) 213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_fmtdesc fdesc; 213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_frmsizeenum frmsize; 213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int alignment = 0,buffer_size = 0; 214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fds[2]; 214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int r,ret=0; 214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool codec_ambiguous = false; 214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STRING device_name = (OMX_STRING)"/dev/video32"; 214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char property_value[PROPERTY_VALUE_MAX] = {0}; 214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FILE *soc_file = NULL; 214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char buffer[10]; 214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 214811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 214911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char platform_name[PROPERTY_VALUE_MAX]; 215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("ro.board.platform", platform_name, "0"); 215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(platform_name, "msm8610", 7)) { 215211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel device_name = (OMX_STRING)"/dev/video/q6_dec"; 215311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_q6_platform = true; 215411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel maxSmoothStreamingWidth = 1280; 215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel maxSmoothStreamingHeight = 720; 215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_thulium_v1 = false; 216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel soc_file = fopen("/sys/devices/soc0/soc_id", "r"); 216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (soc_file) { 216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fread(buffer, 1, 4, soc_file); 216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(soc_file); 216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(buffer) == 246) { 216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel soc_file = fopen("/sys/devices/soc0/revision", "r"); 216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (soc_file) { 216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fread(buffer, 1, 4, soc_file); 216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(soc_file); 216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(buffer) == 1) { 217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_thulium_v1 = true; 217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("is_thulium_v1 = TRUE"); 217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * turn off frame parsing for Android by default. 218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Clients may configure OMX_QCOM_FramePacking_Arbitrary to enable this mode 218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0"); 218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(property_value)) { 218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("arbitrary_bytes mode enabled via property command"); 218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = true; 218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(role, "OMX.qcom.video.decoder.avc.secure", 219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.avc"; 219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg2.secure", 219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg2"; 220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(role, "OMX.qcom.video.decoder.hevc.secure", 220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.hevc"; 220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(role, "OMX.qcom.video.decoder.vc1.secure", 220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.vc1"; 221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(role, "OMX.qcom.video.decoder.wmv.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.wmv"; 221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg4.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.mpeg4"; 222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(role, "OMX.qcom.video.decoder.vp9.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.vp9"; 222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp(role, "OMX.qcom.video.decoder.vp8.secure", 222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode = true; 222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel role = (OMX_STRING)"OMX.qcom.video.decoder.vp8"; 223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_driver_fd = open(device_name, O_RDWR); 223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("component_init: %s : fd=%d", role, drv_ctx.video_driver_fd); 223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.video_driver_fd < 0) { 223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno); 223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS; 224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator = 1; 224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel operating_frame_rate = DEFAULT_FPS; 224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel high_fps = false; 224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_poll_efd = eventfd(0, 0); 224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_poll_efd < 0) { 224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to create event fd(%s)", strerror(errno)); 224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = subscribe_to_events(drv_ctx.video_driver_fd); 225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ret) { 225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_created = true; 225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = pthread_create(&async_thread_id,0,async_message_thread,this); 225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to create async_message_thread"); 225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_created = false; 225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG 226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel outputExtradataFile = fopen (output_extradata_filename, "ab"); 226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Copy the role information which provides the decoder kind 226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(drv_ctx.kind,role,128); 226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\ 226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.mpeg4",\ 227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE); 227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.timestamp_adjust = true; 227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4; 227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingMPEG4; 227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability=V4L2_PIX_FMT_MPEG4; 227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Initialize Start Code for MPEG4*/ 227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_MPEG4; 227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\ 228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.mpeg2",\ 228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE); 228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2; 228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_MPEG2; 228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingMPEG2; 228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Initialize Start Code for MPEG2*/ 228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_MPEG2; 228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\ 229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("H263 Decoder selected"); 229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_H263; 229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingH263; 229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_H263; 229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_H263; 229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\ 229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW ("DIVX 311 Decoder selected"); 230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3; 230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_DIVX_311; 230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_DIVX; 230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\ 230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected"); 231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4; 231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_DIVX; 231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_DIVX; 231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_ambiguous = true; 231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\ 232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected"); 232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6; 232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_DIVX; 232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx; 232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_DIVX; 232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_ambiguous = true; 232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\ 233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_H264; 233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability=V4L2_PIX_FMT_H264; 233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingAVC; 233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_H264; 233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_nal_length(nal_length); 233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_thulium_v1) { 234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = true; 234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enable arbitrary_bytes for h264"); 234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc",\ 234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE); 234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_MVC; 234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_H264_MVC; 234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC; 234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_H264; 235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_nal_length(nal_length); 235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\ 235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE); 235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC; 235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_HEVC; 235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc; 235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_HEVC; 235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_nal_length(nal_length); 236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\ 236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_VC1; 236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingWMV; 236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_VC1; 236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_VC1_ANNEX_G; 236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\ 237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV; 237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingWMV; 237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_VC1; 237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_VC1_ANNEX_L; 237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_start_codes(codec_type_parse); 237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", \ 237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_VP8; 238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_VP8; 238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingVP8; 238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_VP8; 238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", \ 238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)m_cRole, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE); 238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format = VDEC_CODECTYPE_VP9; 238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability = V4L2_PIX_FMT_VP9; 239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eCompressionFormat = OMX_VIDEO_CodingVP9; 239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse = CODEC_TYPE_VP9; 239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Unknown Component"); 239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidComponentName; 239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COLOR_FORMATTYPE dest_color_format; 240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_disable_ubwc_mode) { 240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_format = VDEC_YUV_FORMAT_NV12; 240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_UBWC; 240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eCompressionFormat == (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC) 240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_color_format = (OMX_COLOR_FORMATTYPE) 240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView; 240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_color_format = (OMX_COLOR_FORMATTYPE) 241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_buffers.set_color_format(dest_color_format)) { 241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting color format failed"); 241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dpb_bit_depth = MSM_VIDC_BIT_DEPTH_8; 241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_progressive = MSM_VIDC_PIC_STRUCT_PROGRESSIVE; 241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_disable_ubwc_mode) { 242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capture_capability = V4L2_PIX_FMT_NV12; 242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capture_capability = V4L2_PIX_FMT_NV12_UBWC; 242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_capability cap; 242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap); 242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to query capabilities"); 242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Capabilities: driver_name = %s, card = %s, bus_info = %s," 243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " version = %d, capabilities = %x", cap.driver, cap.card, 243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cap.bus_info, cap.version, cap.capabilities); 243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret=0; 243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.index=0; 243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.pixelformat, fdesc.flags); 244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.index++; 244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.index=0; 244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.pixelformat, fdesc.flags); 244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.index++; 245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 2451fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nLeft = 0; 2452fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nTop = 0; 2453fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nWidth = 320; 2454fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nHeight = 240; 245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel update_resolution(320, 240, 320, 240); 2456fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set format on output port"); 246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set Format was successful"); 246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_ambiguous) { 246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_capability == V4L2_PIX_FMT_DIVX) { 247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control divx_ctrl; 247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) { 247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4; 247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) { 247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5; 247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6; 247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT; 248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl); 248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set divx version"); 248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Codec should not be ambiguous"); 248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("persist.vidc.dec.conceal_color", property_value, DEFAULT_CONCEAL_COLOR); 249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_conceal_color= atoi(property_value); 249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("trying to set 0x%u as conceal color\n", (unsigned int)m_conceal_color); 249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONCEAL_COLOR; 249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = m_conceal_color; 249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set conceal color %d\n", ret); 249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Get the hardware capabilities 250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&frmsize,0,sizeof(frmsize)); 250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frmsize.index = 0; 250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frmsize.pixel_format = output_capability; 250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, 250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VIDIOC_ENUM_FRAMESIZES, &frmsize); 250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) { 250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to get framesizes"); 250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) { 251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_width = frmsize.stepwise.min_width; 251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_width = frmsize.stepwise.max_width; 251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_height = frmsize.stepwise.min_height; 251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.max_height = frmsize.stepwise.max_height; 251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set format on capture port"); 252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&framesize, 0, sizeof(OMX_FRAMESIZETYPE)); 252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framesize.nWidth = drv_ctx.video_resolution.frame_width; 253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framesize.nHeight = drv_ctx.video_resolution.frame_height; 253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&rectangle, 0, sizeof(OMX_CONFIG_RECTTYPE)); 253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nWidth = drv_ctx.video_resolution.frame_width; 253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nHeight = drv_ctx.video_resolution.frame_height; 253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set Format was successful"); 253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode) { 253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE; 253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret); 254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret); 254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_capability == V4L2_PIX_FMT_H264_MVC) { 254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_MVC_BUFFER_LAYOUT; 254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_MVC_TOP_BOTTOM; 255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set MVC buffer layout"); 255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_thulium_v1) { 255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_smoothstreaming(); 255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to enable smooth streaming on driver"); 256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Get the Buffer requirements for input and output ports*/ 256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT; 256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode) { 257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.alignment = SECURE_ALIGN; 257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.alignment = SECURE_ALIGN; 257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.alignment = SZ_4K; 257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.alignment = SZ_4K; 257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata = 0; 257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.picture_order = VDEC_ORDER_DISPLAY; 258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.idr_only_decoding = 0; 258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.downscalar_width",property_value,"0"); 258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(property_value)) { 258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_width = atoi(property_value); 258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.downscalar_height",property_value,"0"); 259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(property_value)) { 259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_height = atoi(property_value); 259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_downscalar_width < m_decoder_capability.min_width || 259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_height < m_decoder_capability.min_height) { 259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_width = 0; 259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_height = 0; 259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Downscaler configured WxH %dx%d\n", 260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_downscalar_width, m_downscalar_height); 260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.disable.split.mode",property_value,"0"); 260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disable_split_mode = atoi(property_value); 260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("split mode is %s", m_disable_split_mode ? "disabled" : "enabled"); 260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StateLoaded; 260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef DEFAULT_EXTRADATA 261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enable_extradata(DEFAULT_EXTRADATA, true, true); 261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.ip_buf); 261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Input Buffer Size =%u",(unsigned int)drv_ctx.ip_buf.buffer_size); 261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel get_buffer_req(&drv_ctx.op_buf); 261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 || 261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC || 261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) { 261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size; 261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size); 262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nOffset = 0; 262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.pBuffer == NULL) { 262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed "); 262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 || 262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) { 263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils == NULL) { 263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils = new H264_Utils(); 263211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils == NULL) { 263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("parser utils Allocation failed "); 263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->initialize_frame_checking_environment(); 263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size); 263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser = new h264_stream_parser(); 264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!h264_parser) { 264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!"); 264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pipe(fds)) { 264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("pipe creation failed"); 265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_in = fds[0]; 265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_out = fds[1]; 265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_created = true; 265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel r = pthread_create(&msg_thread_id,0,message_thread_dec,this); 265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (r < 0) { 265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("component_init(): message_thread_dec creation failed"); 265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_created = false; 266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Component Init Failed"); 266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("omx_vdec::component_init() success : fd=%d", 266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_driver_fd); 267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer)); 267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::GetComponentVersion 267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns the component version. 268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel TBD. 268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone. 268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_component_version 269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel( 269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_STRING componentName, 269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* componentVersion, 269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* specVersion, 269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_UUIDTYPE* componentUUID 269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) componentName; 270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) componentVersion; 270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) componentUUID; 270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Comp Version in Invalid State"); 270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* TBD -- Return the proper version */ 270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (specVersion) { 270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel specVersion->nVersion = OMX_SPEC_VERSION; 270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::SendCommand 271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns zero if all the buffers released.. 271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp, 272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_COMMANDTYPE cmd, 272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 param1, 272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR cmdData 273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) cmdData; 273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command: Recieved a Command from Client"); 273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State"); 273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX 274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) { 274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush " 274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "to invalid port: %u", (unsigned int)param1); 274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND); 274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_wait(&m_cmd_lock); 274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command: Command Processed"); 274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::SendCommand 275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns zero if all the buffers released.. 275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, 276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_COMMANDTYPE cmd, 276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 param1, 276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR cmdData 277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) cmdData; 277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE eState = (OMX_STATETYPE) param1; 277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int bFlag = 1,sem_posted = 0,ret=0; 277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd); 277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d", 278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state, eState); 278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmd == OMX_CommandStateSet) { 278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued"); 278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState); 278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Loaded */ 278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateLoaded) { 278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateIdle) { 279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //if all buffers are allocated or all ports disabled 279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocate_done() || 279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) { 279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle"); 279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending"); 279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING); 279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Loaded */ 280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateLoaded) { 280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded"); 280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to WaitForResources */ 280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition */ 281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources"); 281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Executing */ 281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateExecuting) { 281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing"); 281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Pause */ 282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause"); 282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Invalid */ 282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid"); 283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\ 283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eState); 283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is IDLE */ 284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateIdle) { 284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateLoaded) { 284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_done()) { 284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Since error is None , we will post an event at the end 284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel of this function definition 284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded"); 285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending"); 285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING); 285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Executing */ 285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateExecuting) { 286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING); 286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 1; 286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state=OMX_StateExecuting; 286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful"); 286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Idle */ 286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateIdle) { 286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle"); 287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to WaitForResources */ 287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources"); 287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Pause */ 288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*To pause the Video core we need to start the driver*/ 288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START, 288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NULL) < */0) { 288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED"); 288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause"); 289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Invalid */ 289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid"); 289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState); 290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /******************************/ 290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Executing */ 290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /******************************/ 290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateExecuting) { 291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting"); 291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Idle */ 291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateIdle) { 291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition 291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle"); 291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) { 291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_ALL); 292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Paused */ 292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("PAUSE Command Issued"); 292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StatePause; 292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 1; 293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Loaded */ 293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateLoaded) { 293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded"); 293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to WaitForResources */ 293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources"); 294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Executing */ 294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateExecuting) { 294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing"); 294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Invalid */ 295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid"); 295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState); 295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Pause */ 296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StatePause) { 296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Executing */ 296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateExecuting) { 296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pause --> Executing"); 296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StateExecuting; 297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 1; 297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Idle */ 297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateIdle) { 297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition */ 297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pause --> Idle"); 297711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) { 297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_ALL); 298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to loaded */ 298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateLoaded) { 298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Pause --> loaded"); 298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to WaitForResources */ 299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Pause --> WaitForResources"); 299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Pause */ 300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Pause --> Pause"); 300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Invalid */ 300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Pause --> Invalid"); 300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState); 301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is WaitForResources */ 301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateWaitForResources) { 302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Loaded */ 302111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateLoaded) { 302211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 302311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition */ 302411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded"); 302511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 302611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to WaitForResources */ 302711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 302811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources"); 302911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState, 303011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 303111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 303211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 303311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Executing */ 303411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateExecuting) { 303511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing"); 303611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 303711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 303811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 303911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 304011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Pause */ 304111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 304211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause"); 304311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 304411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 304511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 304611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 304711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Invalid */ 304811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 304911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid"); 305011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 305111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 305211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 305311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Loaded - 305411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is NOT tested by Khronos TS */ 305511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 305611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 305711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState); 305811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 305911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 306011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 306111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /********************************/ 306211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Invalid */ 306311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*******************************/ 306411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateInvalid) { 306511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* State Transition from Inavlid to any state */ 306611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == (OMX_StateLoaded || OMX_StateWaitForResources 306711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || OMX_StateIdle || OMX_StateExecuting 306811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || OMX_StatePause || OMX_StateInvalid)) { 306911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded"); 307011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorInvalidState,\ 307111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 307211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 307311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 307411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (cmd == OMX_CommandFlush) { 307511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued" 307611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "with param1: %u", (unsigned int)param1); 307711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 307811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel send_codec_config(); 307911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 308011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmd == OMX_CommandFlush && (param1 == OMX_CORE_INPUT_PORT_INDEX || 308111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel param1 == OMX_ALL)) { 308211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (android_atomic_add(0, &m_queued_codec_config_count) > 0) { 308311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct timespec ts; 308411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 308511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel clock_gettime(CLOCK_REALTIME, &ts); 308611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts.tv_sec += 2; 308711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("waiting for %d EBDs of CODEC CONFIG buffers ", 308811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queued_codec_config_count); 308911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_FLUSH_DEFERRED); 309011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (sem_timedwait(&m_safe_flush, &ts)) { 309111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to wait for EBDs of CODEC CONFIG buffers"); 309211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 309311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&m_flags,OMX_COMPONENT_FLUSH_DEFERRED); 309411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 309511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 309611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 309711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 309811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); 309911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 310011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) { 310111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 310211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 310311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) { 310411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 310511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set the Semaphore"); 310611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 310711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(param1); 310811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 310911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 311011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ( cmd == OMX_CommandPortEnable) { 311111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued" 311211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "with param1: %u", (unsigned int)param1); 311311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 311411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bEnabled = OMX_TRUE; 311511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 311611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (m_state == OMX_StateLoaded && 311711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 311811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || allocate_input_done()) { 311911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX, 312011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 312111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 312211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending"); 312311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING); 312411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 312511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 312611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 312711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 312811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 312911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Enable output Port command recieved"); 313011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bEnabled = OMX_TRUE; 313111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 313211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (m_state == OMX_StateLoaded && 313311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 313411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (allocate_output_done())) { 313511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX, 313611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 313711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 313811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 313911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending"); 314011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 314111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 314211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 314311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* enable/disable downscaling if required */ 314411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = decide_downscalar(); 314511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 314611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("decide_downscalar failed\n"); 314711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 314811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 314911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 315011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (cmd == OMX_CommandPortDisable) { 315111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued" 315211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "with param1: %u", (unsigned int)param1); 315311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) { 315411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_config_flag = false; 315511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bEnabled = OMX_FALSE; 315611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 315711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_input_done()) { 315811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX, 315911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 316011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 316111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING); 316211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 316311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) { 316411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 316511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 316611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 316711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX); 316811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 316911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 317011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 317111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 317211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 317311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 317411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) { 317511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bEnabled = OMX_FALSE; 317611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Disable output Port command recieved"); 317711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 317811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_output_done()) { 317911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\ 318011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 318111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 318211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 318311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 318411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) { 318511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 318611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 318711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 318811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 318911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX); 319011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 319111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 319211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 319311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 319411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 319511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 319611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 319711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd); 319811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNotImplemented; 319911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 320011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone && bFlag) { 320111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT); 320211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 320311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) { 320411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post(&m_cmd_lock); 320511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 320611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 320711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 320811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 320911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 321011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 321111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 321211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ExecuteOmxFlush 321311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 321411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 321511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Executes the OMX flush. 321611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 321711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 321811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flushtype - input flush(1)/output flush(0)/ both. 321911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 322011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 322111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 322211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 322311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 322411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_omx_flush(OMX_U32 flushType) 322511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 322611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 322711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane; 322811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer v4l2_buf; 322911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_decoder_cmd dec; 323011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("in %s, flushing %u", __func__, (unsigned int)flushType); 323111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 323211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH; 323311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 323411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("in %s: reconfig? %d", __func__, in_reconfig); 323511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 323611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (in_reconfig && flushType == OMX_CORE_OUTPUT_PORT_INDEX) { 323711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress = true; 323811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 323911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 324011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* XXX: The driver/hardware does not support flushing of individual ports 324111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * in all states. So we pretty much need to flush both ports internally, 324211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it 324311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * requested. Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set, 324411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * we automatically omit sending the FLUSH done for the "opposite" port. */ 324511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress = true; 324611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress = true; 324711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE; 324811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel request_perf_level(VIDC_TURBO); 324911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 325011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 325211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Flush Port (%u) Failed ", (unsigned int)flushType); 325311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = false; 325411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 325511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 325711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 325811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*========================================================================= 325911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_output_flush 326011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 326111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 326211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at OUTPUT PORT. 326311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 326411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 326511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone. 326611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 326711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 326811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false 326911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/ 327011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_output_flush() 327111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 327211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1 = 0; // Parameter - 1 327311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2 = 0; // Parameter - 2 327411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident = 0; 327511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = true; 327611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 327711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Generate FBD for all Buffers in the FTBq*/ 327811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 327911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Initiate Output Flush"); 328011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 328111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //reset last render TS 328211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_last_rendered_TS > 0) { 328311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_last_rendered_TS = 0; 328411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 328511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 328611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_ftb_q.m_size) { 328711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Buffer queue size %lu pending buf cnt %d", 328811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.m_size,pending_output_buffers); 328911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.pop_entry(&p1,&p2,&ident); 329011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ID(%lx) P1(%lx) P2(%lx)", ident, p1, p2); 329111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == m_fill_output_msg ) { 329211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)(intptr_t)p2); 329311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_FBD) { 329411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)(intptr_t)p1); 329511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 329611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 329711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 329811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress = false; 329911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 330011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 330111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = LLONG_MAX; 330211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = true; 330311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 330411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers); 330511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 330611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 330711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*========================================================================= 330811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_input_flush 330911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 331011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 331111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at INPUT PORT. 331211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 331311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 331411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone. 331511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 331611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 331711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false 331811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/ 331911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_input_flush() 332011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 332111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i =0; 332211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1 = 0; // Parameter - 1 332311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2 = 0; // Parameter - 2 332411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident = 0; 332511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = true; 332611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 332711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Generate EBD for all Buffers in the ETBq*/ 332811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Initiate Input Flush"); 332911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 333011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 333111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Check if the Queue is empty"); 333211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_etb_q.m_size) { 333311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.pop_entry(&p1,&p2,&ident); 333411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 333511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 333611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 333711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 333811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_ETB) { 333911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers++; 3340b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 334111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 334211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 334311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 334411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_EBD) { 334511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p", 334611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p1); 334711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 334811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 334911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 335011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.flush_timestamp(); 335111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if Heap Buffers are to be flushed*/ 335211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes && !(codec_config_flag)) { 335311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Reset all the variables before flusing"); 335411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 335511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count = 0; 335611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = false; 335711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count = 0; 335811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts = LLONG_MAX; 335911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_flags = 0; 336011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 336111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_entries = 0; 336211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Initialize parser"); 336311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils) { 336411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->initialize_frame_checking_environment(); 336511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 336611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 336711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_input_pending_q.m_size) { 336811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pending_q.pop_entry(&p1,&p2,&ident); 336911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1); 337011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 337111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 337211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame) { 337311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame); 337411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 337511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 337611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 337711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) { 337811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 337911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned int)NULL, 338011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)NULL); 338111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 338211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 338311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.flush(); 338411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (codec_config_flag) { 338511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer " 338611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "is not sent to the driver yet"); 338711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 338811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 338911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress = false; 339011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!arbitrary_bytes) { 339111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = LLONG_MAX; 339211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = true; 339311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 339411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 339511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_timestamp) { 339611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.reset_ts_list(); 339711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 339811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 339911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers); 340011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 340111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 340211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 340311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 340411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 340511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 340611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::SendCommandEvent 340711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 340811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 340911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Send the event to decoder pipe. This is needed to generate the callbacks 341011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel in decoder thread context. 341111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 341211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 341311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 341411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 341511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 341611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 341711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 341811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 341911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::post_event(unsigned long p1, 342011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2, 342111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long id) 342211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 342311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 342411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 342511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Just drop messages typically generated by hardware (w/o client request), 342611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * if we've reported an error to client. */ 342711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_error_propogated) { 342811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (id) { 342911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 343011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 343111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Dropping message %lx " 343211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "since client expected to be in error state", id); 343311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 343411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 343511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* whatever */ 343611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 343711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 343811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 343911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 344011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 344111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 344211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (id == m_fill_output_msg || 344311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_FBD || 344411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_PORT_RECONFIG || 344511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH) { 344611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.insert_entry(p1,p2,id); 344711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (id == OMX_COMPONENT_GENERATE_ETB || 344811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_EBD || 344911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY || 345011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH) { 345111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.insert_entry(p1,p2,id); 345211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 345311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cmd_q.insert_entry(p1,p2,id); 345411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 345511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 345611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 345711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this); 345811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_message(this, id); 345911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 346111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 346311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 346411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) 346611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 346711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 346811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!profileLevelType) 346911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 347011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 347111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nPortIndex == 0) { 347211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 3473d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel52; 347411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 347511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 347611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 347711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 347811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 2) { 347911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 348011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 3) { 348111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedBaseline; 348211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 4) { 348311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedHigh; 348411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 348511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 348611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 348711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 348811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 348911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 349011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 349111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = QOMX_VIDEO_MVCProfileStereoHigh; 349211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = QOMX_VIDEO_MVCLevel51; 349311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 349411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 349511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 349611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 349711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 349811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 349911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 350011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain; 350111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_HEVCMainTierLevel51; 350211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 350311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain10; 350411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_HEVCMainTierLevel51; 350511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 350611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 350711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 350811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 350911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 351011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) { 351111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 351211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline; 351311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_H263Level70; 351411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 351511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 351611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 351711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 351811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 351911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 352011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 352111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 352211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 352311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 352411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 352511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 352611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 352711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 352811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 352911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 353011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 353111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE) || 353211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) { 353311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 353411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 353511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 353611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple; 353711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 353811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 353911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain; 354011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_MPEG2LevelHL; 354111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 354211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 354311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 354411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 354511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 354611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 354711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore for codec: %s", drv_ctx.kind); 354811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 354911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 355011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 355111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %u", 355211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nPortIndex); 355311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 355411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 355511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 355611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 355711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 355811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 355911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 356011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::GetParameter 356111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 356211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 356311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Get Parameter method implementation 356411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 356511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 356611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 356711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 356811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 356911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Error None if successful. 357011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 357111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 357211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp, 357311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE paramIndex, 357411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_PTR paramData) 357511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 357611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 357711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 357811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 357911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter:"); 358011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 358111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Param in Invalid State"); 358211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 358311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 358411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (paramData == NULL) { 358511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Get Param in Invalid paramData"); 358611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 358711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 358811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((unsigned long)paramIndex) { 358911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPortDefinition: { 359011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE); 359111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *portDefn = 359211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 359311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition"); 359411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel decide_dpb_buffer_mode(is_down_scalar_enabled); 359511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = update_portdef(portDefn); 359611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) 359711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_def = *portDefn; 359811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 359911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 360011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoInit: { 360111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 360211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *portParamType = 360311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) paramData; 360411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit"); 360511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 360611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portParamType->nVersion.nVersion = OMX_SPEC_VERSION; 360711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE); 360811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portParamType->nPorts = 2; 360911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portParamType->nStartPortNumber = 0; 361011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 361111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 361211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoPortFormat: { 361311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE); 361411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 361511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 361611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat"); 361711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 361811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->nVersion.nVersion = OMX_SPEC_VERSION; 361911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->nSize = sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE); 362011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == portFmt->nPortIndex) { 362211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == portFmt->nIndex) { 362311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat = OMX_COLOR_FormatUnused; 362411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eCompressionFormat = eCompressionFormat; 362511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 362611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\ 362711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " NoMore compression formats"); 362811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 362911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 363011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (1 == portFmt->nPortIndex) { 363111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 363211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 363311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Distinguish non-surface mode from normal playback use-case based on 363411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // usage hinted via "OMX.google.android.index.useAndroidNativeBuffer2" 363511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // For non-android, use the default list 363611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Also use default format-list if FLEXIBLE YUV is supported, 363711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // as the client negotiates the standard color-format if it needs to 363811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool useNonSurfaceMode = false; 363911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_) && !defined(FLEXYUV_SUPPORTED) 364011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel useNonSurfaceMode = (m_enable_android_native_buffers == OMX_FALSE); 364111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 364211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_thulium_v1) { 364311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat = getPreferredColorFormatDefaultMode(portFmt->nIndex); 364411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 364511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat = useNonSurfaceMode ? 364611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel getPreferredColorFormatNonSurfaceMode(portFmt->nIndex) : 364711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel getPreferredColorFormatDefaultMode(portFmt->nIndex); 364811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 364911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 365011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portFmt->eColorFormat == OMX_COLOR_FormatMax ) { 365111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 365211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\ 365311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " NoMore Color formats"); 365411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 365511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("returning color-format: 0x%x", portFmt->eColorFormat); 365611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 365711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: Bad port index %d", 365811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portFmt->nPortIndex); 365911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 366011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 366111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 366211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 366311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Component should support this port definition*/ 366411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamAudioInit: { 366511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 366611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *audioPortParamType = 366711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) paramData; 366811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit"); 366911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 367011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel audioPortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE); 367111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel audioPortParamType->nPorts = 0; 367211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel audioPortParamType->nStartPortNumber = 0; 367311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 367411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 367511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Component should support this port definition*/ 367611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamImageInit: { 367711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 367811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *imagePortParamType = 367911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) paramData; 368011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit"); 368111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 368211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel imagePortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE); 368311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel imagePortParamType->nPorts = 0; 368411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel imagePortParamType->nStartPortNumber = 0; 368511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 368611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 368711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 368811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Component should support this port definition*/ 368911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamOtherInit: { 369011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x", 369111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 369211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedIndex; 369311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 369411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 369511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamStandardComponentRole: { 369611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE); 369711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_COMPONENTROLETYPE *comp_role; 369811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 369911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role->nVersion.nVersion = OMX_SPEC_VERSION; 370011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role->nSize = sizeof(*comp_role); 370111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 370211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d", 370311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 370411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)comp_role->cRole,(const char*)m_cRole, 370511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE); 370611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 370711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 370811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Added for parameter test */ 370911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPriorityMgmt: { 371011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE); 371111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PRIORITYMGMTTYPE *priorityMgmType = 371211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PRIORITYMGMTTYPE *) paramData; 371311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt"); 371411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION; 371511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel priorityMgmType->nSize = sizeof(OMX_PRIORITYMGMTTYPE); 371611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 371711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 371811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 371911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Added for parameter test */ 372011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamCompBufferSupplier: { 372111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE); 372211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = 372311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 372411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier"); 372511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 372611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->nSize = sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE); 372711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION; 372811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == bufferSupplierType->nPortIndex) 372911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 373011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (1 == bufferSupplierType->nPortIndex) 373111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 373211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 373311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 373411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 373511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 373611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 373711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 373811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoAvc: { 373911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x", 374011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 374111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 374211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 374311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: { 374411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: QOMX_IndexParamVideoMvc %08x", 374511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 374611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 374711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 374811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoH263: { 374911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x", 375011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 375111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 375211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 375311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg4: { 375411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x", 375511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 375611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 375711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 375811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg2: { 375911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x", 376011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 376111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 376211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 376311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoProfileLevelQuerySupported: { 376411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE); 376511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex); 376611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType = 376711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData; 376811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_supported_profile_level(profileLevelType); 376911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 377011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 377111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 377211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: { 377311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, GetAndroidNativeBufferUsageParams); 377411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage"); 377511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData; 377611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 377711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 377811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode && !secure_scaling_to_non_secure_opb) { 377911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED | 378011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel GRALLOC_USAGE_PRIVATE_UNCACHED); 378111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 378211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_UNCACHED; 378311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 378411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 378511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!"); 378611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 378711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 378811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 378911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 379011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 379111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 379211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FLEXYUV_SUPPORTED 379311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexFlexibleYUVDescription: { 379411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: describeColorFormat"); 379511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, DescribeColorFormatParams); 379611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = describeColorFormat(paramData); 379711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 379811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 379911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 380011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoProfileLevelCurrent: { 380111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE); 380211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData; 380311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control profile_control, level_control; 380411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 380511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (drv_ctx.decoder_format) { 380611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_CODECTYPE_H264: 380711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE; 380811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel level_control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL; 380911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 381011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 381111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_param of OMX_IndexParamVideoProfileLevelCurrent only available for H264"); 381211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNotImplemented; 381311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 381411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 381511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 381611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &profile_control)) { 381711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((enum v4l2_mpeg_video_h264_profile)profile_control.value) { 381811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE: 381911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE: 382011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile = OMX_VIDEO_AVCProfileBaseline; 382111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 382211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN: 382311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile = OMX_VIDEO_AVCProfileMain; 382411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 382511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED: 382611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile = OMX_VIDEO_AVCProfileExtended; 382711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 382811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH: 382911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile = OMX_VIDEO_AVCProfileHigh; 383011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 383111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10: 383211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile = OMX_VIDEO_AVCProfileHigh10; 383311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 383411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422: 383511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile = OMX_VIDEO_AVCProfileHigh422; 383611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 383711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE: 383811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA: 383911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA: 384011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA: 384111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA: 384211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE: 384311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH: 384411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA: 384511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH: 384611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH: 384711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH: 384811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 384911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 385011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 385111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 385211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 385311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 385411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 385511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 385611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &level_control)) { 385711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((enum v4l2_mpeg_video_h264_level)level_control.value) { 385811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1_0: 385911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel1; 386011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 386111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1B: 386211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel1b; 386311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 386411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1_1: 386511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel11; 386611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 386711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1_2: 386811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel12; 386911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 387011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1_3: 387111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel13; 387211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 387311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_2_0: 387411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel2; 387511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 387611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_2_1: 387711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel21; 387811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 387911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_2_2: 388011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel22; 388111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 388211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_3_0: 388311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel3; 388411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 388511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_3_1: 388611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel31; 388711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 388811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_3_2: 388911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel32; 389011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 389111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_4_0: 389211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel4; 389311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 389411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_4_1: 389511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel41; 389611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 389711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_4_2: 389811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel42; 389911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 390011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_5_0: 390111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel5; 390211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 390311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_5_1: 390411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel51; 3905d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel break; 390611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_5_2: 390711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eLevel = OMX_VIDEO_AVCLevel52; 390811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 390911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 391011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 391111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 391211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 391311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 391411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 391511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 391611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 39172601808ee2992a94c325d05e4065aba60b01840bThierry Strudel case OMX_QTIIndexParamVideoClientExtradata: 39182601808ee2992a94c325d05e4065aba60b01840bThierry Strudel { 39192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CLIENT_EXTRADATATYPE); 39202601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QTIIndexParamVideoClientExtradata"); 39212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel QOMX_VIDEO_CLIENT_EXTRADATATYPE *pParam = 39222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (QOMX_VIDEO_CLIENT_EXTRADATATYPE *)paramData; 39232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel pParam->nExtradataSize = VENUS_EXTRADATA_SIZE(4096, 2160); 39242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel pParam->nExtradataAllocSize = pParam->nExtradataSize * MAX_NUM_INPUT_OUTPUT_BUFFERS; 39252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel eRet = OMX_ErrorNone; 39262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 39272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 392811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: { 392911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex); 393011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedIndex; 393111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 393211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 393311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 393411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 393511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)", 393611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width, 393711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height, 393811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.stride, 393911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.scan_lines); 394011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 394111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 394211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 394311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 394411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 394511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data) 394611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 394711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside use_android_native_buffer"); 394811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 394911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data; 395011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 395111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((params == NULL) || 395211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (params->nativeBuffer == NULL) || 395311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (params->nativeBuffer->handle == NULL) || 395411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !m_enable_android_native_buffers) 395511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 395611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_android_native_buffers = OMX_TRUE; 395711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sp<android_native_buffer_t> nBuf = params->nativeBuffer; 395811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = (private_handle_t *)nBuf->handle; 395911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port 396011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *buffer = NULL; 396111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 396211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer = (OMX_U8*)mmap(0, handle->size, 396311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 396411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == MAP_FAILED) { 396511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 396611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 396711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 396811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 396911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer); 397011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 397111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 397211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 397311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 397411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 397511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 397611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 397711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::enable_smoothstreaming() { 397811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 397911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 398011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER; 398111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 398211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 398311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 398411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver."); 398511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 398611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 398711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_mode = true; 398811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 398911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 399011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 399111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 399211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 399311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::Setparameter 399411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 399511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 399611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Set Parameter method implementation. 399711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 399811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 399911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 400011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 400111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 400211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if successful. 400311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 400411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 400511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, 400611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE paramIndex, 400711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR paramData) 400811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 400911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 401011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret=0; 401111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 401211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 401311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char property_value[PROPERTY_VALUE_MAX] = {0}; 401411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 401511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 401611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Param in Invalid State"); 401711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 401811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 401911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (paramData == NULL) { 402011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Param in Invalid paramData"); 402111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 402211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 402311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state != OMX_StateLoaded) && 402411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) && 402511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_out_bEnabled == OMX_TRUE) && 402611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) && 402711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_inp_bEnabled == OMX_TRUE)) { 402811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Param in Invalid State"); 402911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 403011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 403111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((unsigned long)paramIndex) { 403211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPortDefinition: { 403311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE); 403411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 403511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 403611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has 403711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //been called. 403811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d", 403911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->format.video.nFrameHeight, 404011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->format.video.nFrameWidth); 404111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4042fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) { 404311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Buffers requested exceeds max limit %d", 404411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual); 404511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 404611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 404711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 404811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_DirOutput == portDefn->eDir) { 404911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port"); 405011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool port_format_changed = false; 405111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_display_id = portDefn->format.video.pNativeWindow; 405211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int buffer_size; 405311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* update output port resolution with client supplied dimensions 405411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel in case scaling is enabled, else it follows input resolution set 405511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 405611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel decide_dpb_buffer_mode(is_down_scalar_enabled); 405711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_down_scalar_enabled) { 405811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("SetParam OP: WxH(%u x %u)", 405911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameWidth, 406011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameHeight); 406111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->format.video.nFrameHeight != 0x0 && 406211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth != 0x0) { 406311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 406411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 406511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 406611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 406711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 406811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Resolution failed"); 406911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 407011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 407111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 407211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((portDefn->format.video.nFrameHeight != (unsigned int)fmt.fmt.pix_mp.height) || 407311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (portDefn->format.video.nFrameWidth != (unsigned int)fmt.fmt.pix_mp.width)) { 407411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel port_format_changed = true; 407511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 407611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 407711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* set crop info */ 407811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nLeft = 0; 407911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nTop = 0; 408011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nWidth = portDefn->format.video.nFrameWidth; 408111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nHeight = portDefn->format.video.nFrameHeight; 408211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4083fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nLeft = 0; 4084fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nTop = 0; 4085fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nWidth = rectangle.nWidth; 4086fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nHeight = rectangle.nHeight; 4087fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 408811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = is_video_session_supported(); 408911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet) 409011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 409111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 409211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 40932601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.height = (unsigned int)portDefn->format.video.nFrameHeight; 40942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.width = (unsigned int)portDefn->format.video.nFrameWidth; 409511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 409611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d", 409711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height, fmt.fmt.pix_mp.width); 409811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 409911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 410011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Resolution failed"); 410111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 410211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 410311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 410411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 410511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 410611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet) { 410711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 410811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 410911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 411011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode) { 411111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 411211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE_SCALING_THRESHOLD; 411311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) { 411411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed getting secure scaling threshold : %d, id was : %x", errno, control.id); 411511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 411611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 411711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* This is a workaround for a bug in fw which uses stride 411811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * and slice instead of width and height to check against 411911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * the threshold. 412011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 412111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 stride, slice; 412211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) { 412311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, portDefn->format.video.nFrameWidth); 412411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12, portDefn->format.video.nFrameHeight); 412511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) { 412611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameWidth); 412711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameHeight); 4128b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) { 4129b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, portDefn->format.video.nFrameWidth); 4130b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, portDefn->format.video.nFrameHeight); 413111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 413211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = portDefn->format.video.nFrameWidth; 413311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel slice = portDefn->format.video.nFrameHeight; 413411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 413511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 413611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Stride is %d, slice is %d, sxs is %d\n", stride, slice, stride * slice); 413711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Threshold value is %d\n", control.value); 413811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 413911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (stride * slice <= (OMX_U32)control.value) { 414011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_scaling_to_non_secure_opb = true; 414111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enabling secure scalar out of CPZ"); 414211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_NON_SECURE_OUTPUT2; 414311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 414411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) { 414511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Enabling non-secure output2 failed"); 414611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 414711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 414811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 414911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 415011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 415111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 415211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 415311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet) { 415411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 415511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 415611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 415711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) { 415811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Requested o/p buf count (%u) exceeds limit (%u)", 415911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS); 416011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 416111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!client_buffers.get_buffer_req(buffer_size)) { 416211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error in getting buffer requirements"); 416311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 416411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!port_format_changed) { 416511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4166fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Buffer count can change only when port is unallocated 4167fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_out_mem_ptr && 4168fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel (portDefn->nBufferCountActual != drv_ctx.op_buf.actualcount || 4169fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel portDefn->nBufferSize != drv_ctx.op_buf.buffer_size)) { 4170fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 417111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Cannot change o/p buffer count since all buffers are not freed yet !"); 417211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 417311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 417411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 417511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 417611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // route updating of buffer requirements via c2d proxy. 417711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Based on whether c2d is enabled, requirements will be handed 417811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // to the vidc driver appropriately 417911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = client_buffers.set_buffer_req(portDefn->nBufferSize, 418011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual); 418111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 418211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_def = *portDefn; 418311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 418411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%u: %u)", 418511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.mincount, (unsigned int)buffer_size, 418611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize); 418711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 418811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 418911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 419011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (OMX_DirInput == portDefn->eDir) { 419111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port"); 419211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool port_format_changed = false; 419311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((portDefn->format.video.xFramerate >> 16) > 0 && 419411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) { 419511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Frame rate only should be set if this is a "known value" or to 419611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // activate ts prediction logic (arbitrary mode only) sending input 419711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // timestamps with max value (LLONG_MAX). 4198fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_fps_received = portDefn->format.video.xFramerate; 419911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %u", 420011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.xFramerate >> 16); 420111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator, 420211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator); 420311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.frame_rate.fps_numerator) { 420411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 420511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = 30; 420611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 420711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.frame_rate.fps_denominator) 420811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = (int) 420911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 421011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator = 1; 421111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 421211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator; 421311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)", 421411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator / 421511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (float)drv_ctx.frame_rate.fps_denominator); 421611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 421711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_outputparm oparm; 421811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*XXX: we're providing timing info as seconds per frame rather than frames 421911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * per second.*/ 422011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 422111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 422211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 422311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_streamparm sparm; 422411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 422511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.parm.output = oparm; 422611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) { 422711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unable to convey fps info to driver, performance might be affected"); 422811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 422911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 423011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 423111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_control.request_cores(frm_int); 423211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 423311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 423411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.video_resolution.frame_height != 423511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameHeight || 423611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width != 423711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth) { 423811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("SetParam IP: WxH(%u x %u)", 423911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameWidth, 424011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameHeight); 424111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel port_format_changed = true; 424211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 frameWidth = portDefn->format.video.nFrameWidth; 424311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 frameHeight = portDefn->format.video.nFrameHeight; 424411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frameHeight != 0x0 && frameWidth != 0x0) { 424511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_smoothstreaming_mode && 424611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((frameWidth * frameHeight) < 424711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_smoothstreaming_width * m_smoothstreaming_height))) { 424811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameWidth = m_smoothstreaming_width; 424911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameHeight = m_smoothstreaming_height; 425011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("NOTE: Setting resolution %u x %u " 425111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "for adaptive-playback/smooth-streaming", 425211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)frameWidth, (unsigned int)frameHeight); 425311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 4254fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 4255fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nLeft = 0; 4256fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nTop = 0; 4257fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nWidth = frameWidth; 4258fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nHeight = frameHeight; 4259fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 426011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel update_resolution(frameWidth, frameHeight, 426111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameWidth, frameHeight); 426211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = is_video_session_supported(); 426311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet) 426411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 42652601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (is_down_scalar_enabled) { 42662601808ee2992a94c325d05e4065aba60b01840bThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 42672601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 42682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 42692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 42702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 42712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("DS Enabled : height = %d , width = %d", 42722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width); 42732601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 42742601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } else { 42752601808ee2992a94c325d05e4065aba60b01840bThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 42762601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 42772601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 42782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 42792601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 42802601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("DS Disabled : height = %d , width = %d", 42812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width); 42822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 42832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 42842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 42852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 42862601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 428711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 428811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Resolution failed"); 428911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 429011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 429111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!is_down_scalar_enabled) 429211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 429311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 429411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 429511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 429611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_custom_buffersize.input_buffersize 429711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && (portDefn->nBufferSize > m_custom_buffersize.input_buffersize)) { 429811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Custom buffer size set by client: %d, trying to set: %d", 429911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_custom_buffersize.input_buffersize, portDefn->nBufferSize); 430011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 430111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 430211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 430311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) { 430411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Requested i/p buf count (%u) exceeds limit (%u)", 430511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS); 430611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 430711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 430811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 4309fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Buffer count can change only when port is unallocated 4310fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_inp_mem_ptr && 4311fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel (portDefn->nBufferCountActual != drv_ctx.ip_buf.actualcount || 4312fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size)) { 431311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Cannot change i/p buffer count since all buffers are not freed yet !"); 431411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 431511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 431611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 431711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 431811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount 431911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) { 432011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel port_format_changed = true; 432111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf; 432211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual; 432311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) & 432411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (~(buffer_prop->alignment - 1)); 432511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_buffer_req(buffer_prop); 432611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 432711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (false == port_format_changed) { 432811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%u: %u)", 432911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.mincount, (unsigned int)drv_ctx.ip_buf.buffer_size, 433011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize); 433111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 433211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 433311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (portDefn->eDir == OMX_DirMax) { 433411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d", 433511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->nPortIndex); 433611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 433711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 433811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 433911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 434011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoPortFormat: { 434111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE); 434211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 434311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 434411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret=0; 434511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 434611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat 0x%x, port: %u", 434711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat, (unsigned int)portFmt->nPortIndex); 434811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 434911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 435011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (1 == portFmt->nPortIndex) { 435111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 43522601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 43532601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (ret < 0) { 43542601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__); 43552601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return OMX_ErrorBadParameter; 43562601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 435711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum vdec_output_fromat op_format; 435811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 43592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m || 436011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 43612601808ee2992a94c325d05e4065aba60b01840bThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView || 436211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar || 436311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) { 436411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12; 436511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 43662601808ee2992a94c325d05e4065aba60b01840bThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) { 436711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12_UBWC; 436811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 436911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 437011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 437111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 43722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) { 437311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12_UBWC; 437411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 437511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12; 437611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 437711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 437811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 437911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_format = op_format; 438011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 438111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 438211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set output format failed"); 438311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 438411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 438511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 438611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 438711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 438811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 438911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 439011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_buffers.set_color_format(portFmt->eColorFormat)) { 439111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set color format failed"); 439211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 439311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 439411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 439511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 439611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 439711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 439811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 439911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexPortDefn: { 440011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PARAM_PORTDEFINITIONTYPE); 440111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt = 440211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData; 440311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %u", 440411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portFmt->nFramePackingFormat); 440511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 440611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Input port */ 440711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portFmt->nPortIndex == 0) { 4408fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // arbitrary_bytes mode cannot be changed arbitrarily since this controls how: 4409fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // - headers are allocated and 4410fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // - headers-indices are derived 4411fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Avoid changing arbitrary_bytes when the port is already allocated 4412fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_inp_mem_ptr) { 4413fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Cannot change arbitrary-bytes-mode since input port is not free!"); 4414fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 4415fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 441611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) { 441711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode || m_input_pass_buffer_fd) { 441811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 441911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode"); 442011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 442111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 442211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = true; 442311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 442411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (portFmt->nFramePackingFormat == 442511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_FramePacking_OnlyOneCompleteFrame) { 442611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = false; 442711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 442811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0"); 442911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(property_value)) { 443011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("arbitrary_bytes enabled via property command"); 443111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = true; 443211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 443311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 443411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 443511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %u", 443611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portFmt->nFramePackingFormat); 443711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 443811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 443911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 444011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port"); 444111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid && 444211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->nMemRegion < OMX_QCOM_MemRegionMax) && 444311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) { 444411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_region_smi = OMX_TRUE; 444511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 444611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set"); 444711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_output_pmem = OMX_TRUE; 444811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 444911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 445011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 445111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 445211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_thulium_v1 && !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", 445311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) { 445411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arbitrary_bytes = true; 445511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Force arbitrary_bytes to true for h264"); 445611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 445711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 445811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 445911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamStandardComponentRole: { 446011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE); 446111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_COMPONENTROLETYPE *comp_role; 446211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 446311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s", 446411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role->cRole); 446511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 446611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state == OMX_StateLoaded)&& 446711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags, OMX_COMPONENT_IDLE_PENDING)) { 446811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set Parameter called in valid state"); 446911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 447011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 447111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 447211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 447311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 447411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE)) { 447511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((char*)comp_role->cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE)) { 447611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE); 447711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 447811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 447911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedSetting; 448011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 448111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 448211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((char*)comp_role->cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 448311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE); 448411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 448511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 448611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 448711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 448811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) { 448911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) { 449011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE); 449111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 449211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 449311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 449411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 449511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) { 449611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE)) { 449711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE); 449811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 449911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 450011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedSetting; 450111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 450211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) { 450311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) { 450411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE); 450511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 450611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 450711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 450811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 450911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx", OMX_MAX_STRINGNAME_SIZE)) || 451011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311", OMX_MAX_STRINGNAME_SIZE)) || 451111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4", OMX_MAX_STRINGNAME_SIZE)) 451211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) { 451311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE)) { 451411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE); 451511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 451611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 451711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedSetting; 451811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 451911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) || 452011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE)) 452111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) { 452211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) { 452311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE); 452411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 452511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 452611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedSetting; 452711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 452811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) { 452911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE) || 453011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) { 453111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE); 453211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 453311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 453411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 453511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 453611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { 453711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE) || 453811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) { 453911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE); 454011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 454111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 454211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 454311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 454411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 454511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((const char*)comp_role->cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 454611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE); 454711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 454811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole); 454911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 455011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 455111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 455211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind); 455311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidComponentName; 455411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 455511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 455611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 455711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 455811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPriorityMgmt: { 455911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE); 456011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateLoaded) { 456111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Parameter called in Invalid State"); 456211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 456311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 456411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData; 456511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %u", 456611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)priorityMgmtype->nGroupID); 456711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 456811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %u", 456911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)priorityMgmtype->nGroupPriority); 457011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 457111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_priority_mgm.nGroupID = priorityMgmtype->nGroupID; 457211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority; 457311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 457411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 457511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 457611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 457711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamCompBufferSupplier: { 457811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE); 457911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 458011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d", 458111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->eBufferSupplier); 458211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1) 458311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier; 458411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 458511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 458611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 458711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 458811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 458911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 459011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 459111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 459211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoAvc: { 459311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d", 459411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 459511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 459611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 459711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: { 459811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: QOMX_IndexParamVideoMvc %d", 459911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 460011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 460111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 460211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoH263: { 460311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d", 460411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 460511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 460611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 460711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg4: { 460811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d", 460911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 461011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 461111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 461211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg2: { 461311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d", 461411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 461511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 461611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 461711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamLowLatencyMode: { 461811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 461911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 462011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE* pParam = 462111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE*)paramData; 462211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->bLowLatencyMode) { 462311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enabling DECODE order"); 462411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.set_timestamp_reorder_mode(false); 462511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 462611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 462711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 462811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 462911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set picture order failed"); 463011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 463111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 463211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 463311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 463411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 463511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoDecoderPictureOrder: { 463611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DECODER_PICTURE_ORDER); 463711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder = 463811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData; 463911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 464011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pic_order,rc=0; 464111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d", 464211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pictureOrder->eOutputPictureOrder); 464311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) { 464411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY; 464511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) { 464611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 464711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.set_timestamp_reorder_mode(false); 464811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 464911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 465011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 465111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 465211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = pic_order; 465311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 465411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 465511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set picture order failed"); 465611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 465711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 465811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 465911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 466011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 466111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamConcealMBMapExtraData: 466211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 466311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false, 466411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 466511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 466611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamFrameInfoExtraData: 466711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 466811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false, 466911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 467011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 467111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_ExtraDataFrameDimension: 467211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 467311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_FRAMEDIMENSION_EXTRADATA, false, 467411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 467511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 467611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamInterlaceExtraData: 467711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 467811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false, 467911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 468011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 468111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamH264TimeInfo: 468211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 468311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false, 468411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 468511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 468611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoFramePackingExtradata: 468711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 468811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_FRAMEPACK_EXTRADATA, false, 468911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 469011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 469111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoQPExtraData: 469211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 469311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_QP_EXTRADATA, false, 469411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 469511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 469611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoInputBitsInfoExtraData: 469711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 469811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_BITSINFO_EXTRADATA, false, 469911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 470011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 470111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexEnableExtnUserData: 470211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 470311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_EXTNUSER_EXTRADATA, false, 470411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 470511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 470611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamVQZipSEIExtraData: 470711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 470811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false, 470911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 471011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 471111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoDivx: { 471211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData; 471311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 471411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 471511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexPlatformPvt: { 471611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PLATFORMPRIVATE_EXTN); 471711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port"); 471811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData; 471911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 472011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type); 472111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 472211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 472311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_pvt_entry_pmem = OMX_TRUE; 472411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) { 472511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set"); 472611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_output_pmem = OMX_TRUE; 472711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 472811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 472911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 473011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 473111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 473211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoSyncFrameDecodingMode: { 473311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode"); 473411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode"); 473511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 473611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 473711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.idr_only_decoding = 1; 473811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER; 473911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE; 474011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 474111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 474211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set picture order failed"); 474311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 474411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 474511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE; 474611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE; 474711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control); 474811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 474911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Sync frame setting failed"); 475011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 475111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 475211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Setting sync frame decoding on driver might change buffer 475311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * requirements so update them here*/ 475411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (get_buffer_req(&drv_ctx.ip_buf)) { 475511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer i/p requirements"); 475611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 475711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 475811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (get_buffer_req(&drv_ctx.op_buf)) { 475911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer o/p requirements"); 476011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 476111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 476211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 476311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 476411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 476511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 476611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamIndexExtraDataType: { 476711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXEXTRADATATYPE); 476811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData; 476911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) && 477011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (extradataIndexType->bEnabled == OMX_TRUE) && 477111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (extradataIndexType->nPortIndex == 1)) { 477211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming"); 477311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled); 477411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 477511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 477611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 477711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 477811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamEnableSmoothStreaming: { 477911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef SMOOTH_STREAMING_DISABLED 478011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_smoothstreaming(); 478111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 478211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 478311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 478411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 478511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 478611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 478711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Need to allow following two set_parameters even in Idle 478811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * state. This is ANDROID architecture which is not in sync 478911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * with openmax standard. */ 479011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: { 479111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, EnableAndroidNativeBuffersParams); 479211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData; 4793fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (enableNativeBuffers->nPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) { 4794fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers allowed only on output port!"); 4795fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel eRet = OMX_ErrorUnsupportedSetting; 4796fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4797fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (m_out_mem_ptr) { 4798fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers is not allowed since Output port is not free !"); 4799fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel eRet = OMX_ErrorInvalidState; 4800fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4801fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 480211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enableNativeBuffers) { 480311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_enable_android_native_buffers = enableNativeBuffers->enable; 480411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 480511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if !defined(FLEXYUV_SUPPORTED) 480611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 480711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Use the most-preferred-native-color-format as surface-mode is hinted here 480811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!client_buffers.set_color_format(getPreferredColorFormatDefaultMode(0))) { 480911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set native color format!"); 481011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 481111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 481211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 481311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 481411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 481511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 481611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: { 481711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, UseAndroidNativeBufferParams); 481811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = use_android_native_buffer(hComp, paramData); 481911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 482011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 482111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if ALLOCATE_OUTPUT_NATIVEHANDLE 482211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexAllocateNativeHandle: { 4823fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 482411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel AllocateNativeHandleParams* allocateNativeHandleParams = (AllocateNativeHandleParams *) paramData; 4825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, AllocateNativeHandleParams); 4826fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4827fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (allocateNativeHandleParams->nPortIndex != OMX_CORE_INPUT_PORT_INDEX) { 4828fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle allowed only on input port!"); 4829fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel eRet = OMX_ErrorUnsupportedSetting; 4830fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4831fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (m_inp_mem_ptr) { 4832fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle is not allowed since Input port is not free !"); 4833fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel eRet = OMX_ErrorInvalidState; 4834fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4835fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4836fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 483711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocateNativeHandleParams != NULL) { 483811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocate_native_handle = allocateNativeHandleParams->enable; 483911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 484011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 484111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 484211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //ALLOCATE_OUTPUT_NATIVEHANDLE 484311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 484411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamEnableTimeStampReorder: { 484511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXTIMESTAMPREORDER); 484611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData; 484711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) { 484811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (reorder->bEnable == OMX_TRUE) { 484911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int =0; 485011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.set_timestamp_reorder_mode(true); 485111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 485211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.set_timestamp_reorder_mode(false); 485311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 485411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.set_timestamp_reorder_mode(false); 485511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (reorder->bEnable == OMX_TRUE) { 485611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 485711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 485811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 485911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 486011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 486111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoProfileLevelCurrent: { 486211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE); 486311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = 486411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData; 486511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam) { 486611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile_lvl.eProfile = pParam->eProfile; 486711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile_lvl.eLevel = pParam->eLevel; 486811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 486911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 487011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 487111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 487211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoMetaBufferMode: 487311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 487411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, StoreMetaDataInBuffersParams); 487511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel StoreMetaDataInBuffersParams *metabuffer = 487611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (StoreMetaDataInBuffersParams *)paramData; 487711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!metabuffer) { 487811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid param: %p", metabuffer); 487911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 488011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 488111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 488211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_disable_dynamic_buf_mode) { 488311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Dynamic buffer mode is disabled"); 488411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 488511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 488611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 488711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (metabuffer->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 4888fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4889fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_out_mem_ptr) { 4890fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Enable/Disable dynamic-buffer-mode is not allowed since Output port is not free !"); 4891fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel eRet = OMX_ErrorInvalidState; 4892fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4893fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 489411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //set property dynamic buffer mode to driver. 489511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 489611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 489711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_ALLOC_MODE_OUTPUT; 489811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (metabuffer->bStoreMetaData == true) { 489911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_DYNAMIC; 490011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 490111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_STATIC; 490211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 490311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control); 490411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!rc) { 490511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("%s buffer mode", 490611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (metabuffer->bStoreMetaData == true)? "Enabled dynamic" : "Disabled dynamic"); 490711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dynamic_buf_mode = metabuffer->bStoreMetaData; 490811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 490911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to %s buffer mode", 491011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (metabuffer->bStoreMetaData == true)? "enable dynamic" : "disable dynamic"); 491111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 491211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 491311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 491411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR( 491511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_QcomIndexParamVideoMetaBufferMode not supported for port: %u", 491611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)metabuffer->nPortIndex); 491711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 491811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 491911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 492011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 492111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoDownScalar: 492211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 492311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXDOWNSCALAR); 492411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_INDEXDOWNSCALAR* pParam = (QOMX_INDEXDOWNSCALAR*)paramData; 492511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 492611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 492711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoDownScalar %d\n", pParam->bEnable); 492811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 492911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam && pParam->bEnable) { 493011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = enable_downscalar(); 493111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 493211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__); 493311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 493411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 493511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_force_down_scalar = pParam->bEnable; 493611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 493711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = disable_downscalar(); 493811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) { 493911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__); 494011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 494111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 494211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_force_down_scalar = pParam->bEnable; 494311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 494411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 494511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 494611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED 494711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoAdaptivePlaybackMode: 494811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 494911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, PrepareForAdaptivePlaybackParams); 495011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_GoogleAndroidIndexPrepareForAdaptivePlayback"); 495111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PrepareForAdaptivePlaybackParams* pParams = 495211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (PrepareForAdaptivePlaybackParams *) paramData; 495311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParams->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) { 495411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pParams->bEnable) { 495511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 495611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 495711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParams->nMaxFrameWidth > maxSmoothStreamingWidth 495811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || pParams->nMaxFrameHeight > maxSmoothStreamingHeight) { 495911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR( 496011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "Adaptive playback request exceeds max supported resolution : [%u x %u] vs [%u x %u]", 496111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pParams->nMaxFrameWidth, (unsigned int)pParams->nMaxFrameHeight, 496211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)maxSmoothStreamingWidth, (unsigned int)maxSmoothStreamingHeight); 496311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 496411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 496511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_adaptive_playback(pParams->nMaxFrameWidth, pParams->nMaxFrameHeight); 496611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 496711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 496811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR( 496911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "Prepare for adaptive playback supported only on output port"); 497011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 497111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 497211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 497311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 497411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 497511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamVideoPreferAdaptivePlayback: 497611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 497711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 497811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoPreferAdaptivePlayback"); 497911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disable_dynamic_buf_mode = ((QOMX_ENABLETYPE *)paramData)->bEnable; 498011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_disable_dynamic_buf_mode) { 498111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Prefer Adaptive Playback is set"); 498211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 498311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 498411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 498511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 498611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoCustomBufferSize: 498711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 498811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CUSTOM_BUFFERSIZE); 498911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoCustomBufferSize"); 499011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_CUSTOM_BUFFERSIZE* pParam = (QOMX_VIDEO_CUSTOM_BUFFERSIZE*)paramData; 499111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) { 499211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 499311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_BUFFER_SIZE_LIMIT; 499411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = pParam->nBufferSize; 499511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 499611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set input buffer size"); 499711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 499811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 499911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.ip_buf); 500011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 500111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_custom_buffersize.input_buffersize = drv_ctx.ip_buf.buffer_size; 500211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Successfully set custom input buffer size = %d", 500311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_custom_buffersize.input_buffersize); 500411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 500511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to get buffer requirement"); 500611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 500711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 500811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 500911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Custom buffer size in not supported on output port"); 501011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 501111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 501211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 501311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 501411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamVQZIPSEIType: 501511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 501611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE); 501711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVQZIPSEIType"); 501811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *pParam = 501911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *)paramData; 502011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Enable VQZIP SEI: %d", pParam->bEnable); 502111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false, 502211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 502311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 502411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to set SEI Extradata"); 502511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 502611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA; 502711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 502811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_QP_EXTRADATA, false, 502911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 503011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 503111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to set QP Extradata"); 503211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 503311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA; 503411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata = client_extradata & ~OMX_QP_EXTRADATA; 503511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 503611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 503711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 503811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 503911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 504011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamPassInputBufferFd: 504111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 504211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); 504311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 504411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_QTIIndexParamPassInputBufferFd not supported in arbitrary buffer mode"); 504511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 504611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 504711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 504811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 504911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pass_buffer_fd = ((QOMX_ENABLETYPE *)paramData)->bEnable; 505011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pass_buffer_fd) 505111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Enable passing input buffer FD"); 505211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 505311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 505411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamForceCompressedForDPB: 505511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 505611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE); 505711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceCompressedForDPB"); 505811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *pParam = 505911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *)paramData; 506011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_disable_ubwc_mode) { 506111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_QTIIndexParamForceCompressedForDPB not supported when ubwc disabled"); 506211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 506311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 506411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 506511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!paramData) { 506611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceCompressedForDPB paramData NULL"); 506711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 506811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 506911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 507011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 507111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_force_compressed_for_dpb = pParam->bEnable; 507211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 507311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 507411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamForceUnCompressedForOPB: 507511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 507611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB"); 507711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *pParam = 507811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *)paramData; 507911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!paramData) { 508011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB paramData is NULL"); 508111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 508211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 508311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 508411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_disable_ubwc_mode = pParam->bEnable; 508511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: UBWC %s for OPB", pParam->bEnable ? "disabled" : "enabled"); 508611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 508711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 50882601808ee2992a94c325d05e4065aba60b01840bThierry Strudel case OMX_QTIIndexParamVideoClientExtradata: 50892601808ee2992a94c325d05e4065aba60b01840bThierry Strudel { 50902601808ee2992a94c325d05e4065aba60b01840bThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CLIENT_EXTRADATATYPE); 50912601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoClientExtradata"); 50922601808ee2992a94c325d05e4065aba60b01840bThierry Strudel QOMX_VIDEO_CLIENT_EXTRADATATYPE *pParam = 50932601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (QOMX_VIDEO_CLIENT_EXTRADATATYPE *)paramData; 50942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_U32 extradata_size = VENUS_EXTRADATA_SIZE(4096, 2160); 50952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (pParam->nExtradataSize < extradata_size || 50962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel pParam->nExtradataAllocSize < (extradata_size * MAX_NUM_INPUT_OUTPUT_BUFFERS) || 50972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel pParam->nExtradataAllocSize < (pParam->nExtradataSize * MAX_NUM_INPUT_OUTPUT_BUFFERS)) { 50982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("set_parameter: Incorrect buffer size for client extradata"); 50992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel eRet = OMX_ErrorBadParameter; 51002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 51012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 51022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (!m_client_extradata_info.set_extradata_info(dup(pParam->nFd), 51032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel pParam->nExtradataAllocSize, pParam->nExtradataSize)) { 51042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("set_parameter: Setting client extradata failed."); 51052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel eRet = OMX_ErrorBadParameter; 51062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 51072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 51082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 51092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 511011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 511111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: { 511211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex); 511311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 511411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 511511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 511611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) 511711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("set_parameter: Error: 0x%x, setting param 0x%x", eRet, paramIndex); 511811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 511911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 512011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 512111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 512211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 512311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::GetConfig 512411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 512511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 512611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Get Config Method implementation. 512711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 512811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 512911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 513011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 513111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 513211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if successful. 513311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 513411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 513511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp, 513611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE configIndex, 513711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_PTR configData) 513811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 513911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 514011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 514111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 514211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 514311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Config in Invalid State"); 514411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 514511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 514611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 514711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((unsigned long)configIndex) { 514811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigInterlaced: { 514911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_CONFIG_INTERLACETYPE); 515011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_CONFIG_INTERLACETYPE *configFmt = 515111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_CONFIG_INTERLACETYPE *) configData; 515211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (configFmt->nPortIndex == 1) { 515311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (configFmt->nIndex == 0) { 515411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive; 515511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (configFmt->nIndex == 1) { 515611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configFmt->eInterlaceType = 515711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 515811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (configFmt->nIndex == 2) { 515911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configFmt->eInterlaceType = 516011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 516111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 516211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:" 516311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " NoMore Interlaced formats"); 516411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 516511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 516611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 516711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 516811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port", 516911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)configFmt->nPortIndex); 517011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 517111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 517211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 517311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 517411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexQueryNumberOfVideoDecInstance: { 517511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_QUERY_DECODER_INSTANCES); 517611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances = 517711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData; 517811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel decoderinstances->nNumOfInstances = 16; 517911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 518011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 518111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 518211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigVideoFramePackingArrangement: { 518311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) { 518411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_FRAME_PACK_ARRANGEMENT); 518511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt = 518611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData; 518711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(configFmt, &m_frame_pack_arrangement, 518811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT)); 518911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 519011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs"); 519111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 519211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 519311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 519411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigCommonOutputCrop: { 519511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_RECTTYPE); 519611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData; 519711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE)); 519811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("get_config: crop info: L: %u, T: %u, R: %u, B: %u", 519911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nLeft, rectangle.nTop, 520011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nWidth, rectangle.nHeight); 520111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 520211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 520311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigPerfLevel: { 520411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL); 520511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 520611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf = 520711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData; 520811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 520911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL; 521011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) { 521111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed getting performance level: %d", errno); 521211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 521311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 521411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 521511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 521611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (control.value) { 521711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO: 521811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel perf->ePerfLevel = OMX_QCOM_PerfLevelTurbo; 521911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 522011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 522111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Unknown perf level %d, reporting Nominal instead", control.value); 522211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Fall through */ 522311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL: 522411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel perf->ePerfLevel = OMX_QCOM_PerfLevelNominal; 522511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 522611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 522711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 522811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 522911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 523011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 523111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigH264EntropyCodingCabac: { 523211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_H264ENTROPYCODINGTYPE); 523311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_H264ENTROPYCODINGTYPE *coding = (QOMX_VIDEO_H264ENTROPYCODINGTYPE *)configData; 523411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 523511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 523611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.decoder_format != VDEC_CODECTYPE_H264) { 523711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_config of OMX_QcomIndexConfigH264EntropyCodingCabac only available for H264"); 523811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNotImplemented; 523911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 524011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 524111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 524211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE; 524311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control)) { 524411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel coding->bCabac = (OMX_BOOL) 524511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (control.value == V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC); 524611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* We can't query driver at the moment for the cabac mode, so 524711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * just use 0xff...f as a place holder for future improvement */ 524811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel coding->nCabacInitIdc = ~0; 524911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 525011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 525111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 525211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 525311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 525411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 5255fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case OMX_QTIIndexConfigDescribeColorAspects: 5256fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 5257fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams); 5258fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData; 5259fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 5260fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(m_client_color_space.sAspects), "GetConfig Client"); 5261fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(m_internal_color_space.sAspects), "GetConfig Internal"); 5262fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 5263fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (params->bRequestingDataSpace) { 5264fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Does not handle dataspace request"); 5265fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 5266fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 5267fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_internal_color_space.bDataSpaceChanged == OMX_TRUE) { 5268fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Updating Client's color aspects with internal"); 5269fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(&(m_client_color_space.sAspects), 5270fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel &(m_internal_color_space.sAspects), sizeof(ColorAspects)); 5271fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.bDataSpaceChanged = OMX_FALSE; 5272fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 5273fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(&(params->sAspects), &(m_client_color_space.sAspects), sizeof(ColorAspects)); 5274fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 5275fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 5276fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 5277fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel case OMX_QTIIndexConfigDescribeHDRColorInfo: 5278fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel { 5279fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel VALIDATE_OMX_PARAM_DATA(configData, DescribeHDRStaticInfoParams); 5280fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DescribeHDRStaticInfoParams *params = (DescribeHDRStaticInfoParams *)configData; 5281fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel auto_lock lock(m_hdr_info_client_lock); 5282fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 5283fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel print_debug_hdr_color_info(&(m_client_hdr_info.sInfo), "GetConfig Client HDR"); 5284fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel print_debug_hdr_color_info(&(m_internal_hdr_info.sInfo), "GetConfig Internal HDR"); 5285fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 5286fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (m_change_client_hdr_info) { 5287fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("Updating Client's HDR Info with internal"); 5288fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel memcpy(&m_client_hdr_info.sInfo, 5289fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel &m_internal_hdr_info.sInfo, sizeof(HDRStaticInfo)); 5290fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_change_client_hdr_info = false; 5291fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 5292fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 5293fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel memcpy(&(params->sInfo), &(m_client_hdr_info.sInfo), sizeof(HDRStaticInfo)); 5294fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 5295fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel break; 5296fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 5297fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel default: 5298fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel { 5299fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex); 5300fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel eRet = OMX_ErrorBadParameter; 5301fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 530211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 530311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 530411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 530511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 530611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 530711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 530811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 530911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 531011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::SetConfig 531111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 531211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 531311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Set Config method implementation 531411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 531511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 531611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 531711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 531811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 531911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if successful. 532011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 532111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_config(OMX_IN OMX_HANDLETYPE hComp, 532211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE configIndex, 532311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR configData) 532411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 532511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 532611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 532711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Config in Invalid State"); 532811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 532911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 533011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 533111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 533211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_CONFIG_NALSIZE *pNal; 533311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 533411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set Config Called"); 533511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 533611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (configIndex == OMX_IndexConfigVideoNalSize) { 533711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control temp; 533811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT; 533911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 534011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_NALSIZE); 534111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData); 534211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (pNal->nNaluBytes) { 534311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case 0: 534411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES; 534511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 534611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case 2: 534711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_TWO_BYTE_LENGTH; 534811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 534911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case 4: 535011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH; 535111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 535211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 535311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 535411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 535511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 535611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!arbitrary_bytes) { 535711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* In arbitrary bytes mode, the assembler strips out nal size and replaces 535811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * with start code, so only need to notify driver in frame by frame mode */ 535911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &temp)) { 536011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT"); 536111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 536211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 536311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 536411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_length = pNal->nNaluBytes; 536611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.init_nal_length(nal_length); 536711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d", nal_length); 536911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 537011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((int)configIndex == (int)OMX_IndexVendorVideoFrameRate) { 537111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData; 537211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Index OMX_IndexVendorVideoFrameRate %u", (unsigned int)config->nFps); 537311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 537411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) { 537511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (config->bEnabled) { 5376fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if ((config->nFps >> 16) > 0 && 5377fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (config->nFps >> 16) <= MAX_SUPPORTED_FPS) { 5378fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_fps_received = config->nFps; 537911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %u", 538011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)config->nFps >> 16); 538111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator, 538211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator); 538311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 538411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.frame_rate.fps_numerator) { 538511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 538611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = 30; 538711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 538811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 538911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.frame_rate.fps_denominator) { 539011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = (int) 539111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 539211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 539311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 539411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator = 1; 539511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 539611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator; 539711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 539811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_outputparm oparm; 539911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*XXX: we're providing timing info as seconds per frame rather than frames 540011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * per second.*/ 540111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 540211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 540311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 540411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_streamparm sparm; 540511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 540611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.parm.output = oparm; 540711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) { 540811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \ 540911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel performance might be affected"); 541011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorHardware; 541111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 541211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_set_fps = true; 541311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 541411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Frame rate not supported."); 541511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorUnsupportedSetting; 541611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 541711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 541811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate"); 541911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_set_fps = false; 542011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 542111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 542211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d", 542311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)config->nPortIndex); 542411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorBadPortIndex; 542511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 542611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 542711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 542811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((int)configIndex == (int)OMX_QcomIndexConfigPerfLevel) { 542911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf = 543011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData; 543111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 543211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 543311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set perf level: %d", perf->ePerfLevel); 543411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 543511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL; 543611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 543711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (perf->ePerfLevel) { 543811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_PerfLevelNominal: 543911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL; 544011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 544111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_PerfLevelTurbo: 544211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO; 544311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 544411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 544511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorUnsupportedSetting; 544611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 544711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 544811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 544911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret == OMX_ErrorNone) { 545011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ? 545111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorUnsupportedSetting : OMX_ErrorNone; 545211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 545311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 545411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 545511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((int)configIndex == (int)OMX_QcomIndexConfigPictureTypeDecode) { 545611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *config = 545711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *)configData; 545811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 545911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set picture type decode: %d", config->eDecodeType); 546011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_PICTYPE_DEC_MODE; 546111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 546211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (config->eDecodeType) { 546311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_PictypeDecode_I: 546411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_ON; 546511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 546611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_PictypeDecode_IPB: 546711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 546811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_OFF; 546911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 547011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 547111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 547211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ? 547311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorUnsupportedSetting : OMX_ErrorNone; 547411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) 547511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set picture type decode"); 547611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 547711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 547811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((int)configIndex == (int)OMX_IndexConfigPriority) { 547911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_U32TYPE *priority = (OMX_PARAM_U32TYPE *)configData; 548011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set_config: priority %d",priority->nU32); 548111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 548211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 548311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 548411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY; 548511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (priority->nU32 == 0) 548611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE; 548711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 548811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE; 548911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 549011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 549111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set Priority"); 549211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorUnsupportedSetting; 549311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 549411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 549511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((int)configIndex == (int)OMX_IndexConfigOperatingRate) { 549611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_U32TYPE *rate = (OMX_PARAM_U32TYPE *)configData; 549711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set_config: operating-rate %u fps", rate->nU32 >> 16); 549811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 549911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 550011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 550111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE; 550211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = rate->nU32; 550311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 550411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel operating_frame_rate = rate->nU32 >> 16; 550511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 550611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 550711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = errno == -EBUSY ? OMX_ErrorInsufficientResources : 550811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorUnsupportedSetting; 550911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set operating rate %u fps (%s)", 551011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rate->nU32 >> 16, errno == -EBUSY ? "HW Overload" : strerror(errno)); 551111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 551211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 5513fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 5514fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeColorAspects) { 5515fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams); 5516fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData; 5517fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!DEFAULT_EXTRADATA & OMX_DISPLAY_INFO_EXTRADATA) { 5518fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel enable_extradata(OMX_DISPLAY_INFO_EXTRADATA, true, true); 5519fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 5520fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 5521fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(params->sAspects), "Set Config"); 5522fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(&m_client_color_space, params, sizeof(DescribeColorAspectsParams)); 5523fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return ret; 5524fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeHDRColorInfo) { 5525fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel VALIDATE_OMX_PARAM_DATA(configData, DescribeHDRStaticInfoParams); 5526fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DescribeHDRStaticInfoParams *params = (DescribeHDRStaticInfoParams *)configData; 5527fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (!DEFAULT_EXTRADATA & OMX_HDR_COLOR_INFO_EXTRADATA) { 5528fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel ret = enable_extradata(OMX_HDR_COLOR_INFO_EXTRADATA, true, true); 5529fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (ret != OMX_ErrorNone) { 5530fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_ERROR("Failed to enable OMX_HDR_COLOR_INFO_EXTRADATA"); 5531fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return ret; 5532fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 5533fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 5534fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 5535fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel print_debug_hdr_color_info(&(params->sInfo), "Set Config HDR"); 5536fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel memcpy(&m_client_hdr_info, params, sizeof(DescribeHDRStaticInfoParams)); 5537fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return ret; 553811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 553911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 554011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 554111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 554211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5543fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define extn_equals(param, extn) (!strcmp(param, extn)) 554411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 554511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 554611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 554711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::GetExtensionIndex 554811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 554911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 555011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX GetExtensionIndex method implementaion. <TBD> 555111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 555211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 555311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 555411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 555511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 555611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 555711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 555811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 555911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE hComp, 556011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_STRING paramName, 556111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_INDEXTYPE* indexType) 556211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 556311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 556411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 556511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Extension Index in Invalid State"); 556611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 556711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode")) { 556811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode; 556911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.QCOM.index.param.IndexExtraData")) { 557011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType; 557111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_FRAMEPACKING_EXTRADATA)) { 557211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoFramePackingExtradata; 557311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, OMX_QCOM_INDEX_CONFIG_VIDEO_FRAMEPACKING_INFO)) { 557411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement; 557511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_QP_EXTRADATA)) { 557611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPExtraData; 557711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_INPUTBITSINFO_EXTRADATA)) { 557811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoInputBitsInfoExtraData; 557911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_EXTNUSER_EXTRADATA)) { 558011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexEnableExtnUserData; 558111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 558211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 558311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (extn_equals(paramName, "OMX.google.android.index.enableAndroidNativeBuffers")) { 558411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 558511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer2")) { 558611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 558711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer")) { 558811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extension: %s is supported", paramName); 558911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 559011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.google.android.index.getAndroidNativeBufferUsage")) { 559111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 559211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 559311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if ALLOCATE_OUTPUT_NATIVEHANDLE 559411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (extn_equals(paramName, "OMX.google.android.index.allocateNativeHandle")) { 559511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexAllocateNativeHandle; 559611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 559711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //ALLOCATE_OUTPUT_NATIVEHANDLE 559811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 559911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (extn_equals(paramName, "OMX.google.android.index.storeMetaDataInBuffers")) { 560011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoMetaBufferMode; 560111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 560211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED 560311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (extn_equals(paramName, "OMX.google.android.index.prepareForAdaptivePlayback")) { 560411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoAdaptivePlaybackMode; 560511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_PREFER_ADAPTIVE_PLAYBACK)) { 560611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoPreferAdaptivePlayback; 560711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 560811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 560911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FLEXYUV_SUPPORTED 561011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (extn_equals(paramName,"OMX.google.android.index.describeColorFormat")) { 561111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexFlexibleYUVDescription; 561211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 561311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 561411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (extn_equals(paramName, "OMX.QCOM.index.param.video.PassInputBufferFd")) { 561511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamPassInputBufferFd; 561611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceCompressedForDPB")) { 561711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceCompressedForDPB; 561811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceUnCompressedForOPB")) { 561911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceUnCompressedForOPB; 562011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extn_equals(paramName, "OMX.QTI.index.param.video.LowLatency")) { 562111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamLowLatencyMode; 56222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_CLIENT_EXTRADATA)) { 56232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoClientExtradata; 5624fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (extn_equals(paramName, "OMX.google.android.index.describeColorAspects")) { 5625fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeColorAspects; 5626fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } else if (extn_equals(paramName, "OMX.google.android.index.describeHDRStaticInfo")) { 5627fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeHDRColorInfo; 562811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 562911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName); 563011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 563111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 563211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 563311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 563411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 563511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 563611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 563711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::GetState 563811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 563911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 564011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns the state information back to the caller.<TBD> 564111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 564211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 564311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 564411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 564511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 564611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Error None if everything is successful. 564711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 564811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_state(OMX_IN OMX_HANDLETYPE hComp, 564911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_STATETYPE* state) 565011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 565111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 565211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *state = m_state; 565311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_state: Returning the state %d",*state); 565411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 565511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 565611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 565711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 565811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 565911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ComponentTunnelRequest 566011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 566111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 566211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Component Tunnel Request method implementation. <TBD> 566311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 566411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 566511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 566611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 566711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 566811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 566911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 567011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 567111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp, 567211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 567311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE peerComponent, 567411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 peerPort, 567511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup) 567611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 567711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 567811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) port; 567911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) peerComponent; 568011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) peerPort; 568111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) tunnelSetup; 568211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented"); 568311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 568411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 568511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 568611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 568711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 568811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::UseOutputBuffer 568911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 569011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 569111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Helper function for Use buffer in the input pin 569211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 569311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 569411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 569511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 569611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 569711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 569811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 569911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 570011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_extradata() 570111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 570211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 570311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.extradata_info.buffer_size) { 570411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) { 570511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 570611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 570711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.extradata_info.ion); 570811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 570911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095); 571011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory( 571111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.size, 4096, 571211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.extradata_info.ion.ion_alloc_data, 571311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.extradata_info.ion.fd_ion_data, 0); 571411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.extradata_info.ion.ion_device_fd < 0) { 571511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc extradata memory"); 571611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 571711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 571811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.uaddr = (char *)mmap(NULL, 571911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.size, 572011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, 572111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.ion.fd_ion_data.fd , 0); 572211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.extradata_info.uaddr == MAP_FAILED) { 572311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to map extradata memory"); 572411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 572511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.extradata_info.ion); 572611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 572711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 572811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 572911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 573011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_other_extradata) { 573111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_other_extradata = (OMX_OTHER_EXTRADATATYPE *)malloc(drv_ctx.extradata_info.buffer_size); 573211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_other_extradata) { 573311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc memory\n"); 573411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 573511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 573611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 573711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 573811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 573911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 574011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_extradata() 574111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 574211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 574311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.extradata_info.uaddr) { 574411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size); 574511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.extradata_info.ion.fd_ion_data.fd); 574611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.extradata_info.ion); 574711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 574811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 574911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_other_extradata) { 575011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_other_extradata); 575111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_other_extradata = NULL; 575211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 575311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 575411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 575511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_output_buffer( 575611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 575711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 575811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 575911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 576011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 576111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 576211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 576311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 576411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 576511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i= 0; // Temporary counter 576611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_setbuffer_cmd setbuffers; 576711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR privateAppData = NULL; 576811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = NULL; 576911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *buff = buffer; 577011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 577111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 577211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 577311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 577411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) port; 577511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 577611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_out_mem_ptr) { 577711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers"); 577811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_output_headers(); 577911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) 578011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_extradata(); 578111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 578211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 578311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 578411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 578511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_out_bm_count,i)) { 578611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 578711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 578811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 578911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 579011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 579111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i >= drv_ctx.op_buf.actualcount) { 579211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount); 579311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 579411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 579511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 579611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) 579711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 579811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 579911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dynamic_buf_mode) { 580011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_out_mem_ptr + i ); 580111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = NULL; 580211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i == (drv_ctx.op_buf.actualcount - 1) && !streaming[CAPTURE_PORT]) { 580311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 580411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rr = 0; 580511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 580611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rr = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON, &buf_type)) { 580711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("STREAMON FAILED : %d", rr); 580811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 580911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 581011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = true; 581111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("STREAMON Successful"); 581211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 581311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 581411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enabling Turbo mode"); 581511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel request_perf_level(VIDC_TURBO); 581611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 581711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_out_bm_count,i); 581811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pAppPrivate = appData; 581911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = buffer; 582011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nAllocLen = sizeof(struct VideoDecoderOutputMetaData); 582111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 582211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 582311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 582411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 582511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 582611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 582711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_use_android_native_buffers) { 582811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 582911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sp<android_native_buffer_t> nBuf = params->nativeBuffer; 583011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)nBuf->handle; 583111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = params->pAppPrivate; 583211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 583311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)buff; 583411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = appData; 583511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 583611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!handle) { 583711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("handle is invalid"); 583811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 583911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 584011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 584111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) { 584211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode && secure_scaling_to_non_secure_opb) { 584311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Buffer size expected %u, got %u, but it's ok since we will never map it", 584411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size); 584511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 584611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 584711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " expected %u, got %u", 584811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size); 584911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 585011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 585111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 585211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 585311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size = handle->size; 585411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 585511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_use_android_native_buffers) { 585611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 585711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buff = (OMX_U8*)mmap(0, handle->size, 585811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 585911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buff == MAP_FAILED) { 586011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 586111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 586211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 586311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 586411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 586511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_ICS_) 586611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[i].nativehandle = handle; 586711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[i].privatehandle = handle; 586811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 586911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!handle) { 587011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 587111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 587211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 587311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd; 587411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].offset = 0; 587511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 587611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 587711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size; 587811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 587911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 588011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 588111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ouput_egl_buffers && !m_use_output_pmem) { 588211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 588311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 588411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment, 588511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.op_buf_ion_info[i].ion_alloc_data, 588611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.op_buf_ion_info[i].fd_ion_data, 588711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_mode ? SECURE_FLAGS_OUTPUT_BUFFER : 0); 588811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) { 588911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd); 589011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 589111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 589211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 589311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 589411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 589511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 589611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel open (MEM_DEVICE,O_RDWR); 589711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 589811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 589911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd); 590011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 590111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 590211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 590311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */ 590411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) { 590511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 590611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel open (MEM_DEVICE,O_RDWR); 590711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 590811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd); 590911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 591011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 591111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 591211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 591311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd, 591411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size, 591511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.alignment)) { 591611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 591711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 591811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 591911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 592011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 592111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 592211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = 592311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size, 592411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, 592511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd,0); 592611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) { 592711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 592811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 592911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 593011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 593111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unable to mmap output buffer"); 593211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 593311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 593411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 593511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].offset = 0; 593611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = appData; 593711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 593811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 593911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem); 594011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!appData || !bytes ) { 594111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && !buffer) { 594211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case"); 594311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 594411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 594511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 594611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 594711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list; 594811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info; 594911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData; 595011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pmem_list || !pmem_list->entryList || !pmem_list->entryList->entry || 595111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !pmem_list->nEntries || 595211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 595311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Pmem info not valid in use buffer"); 595411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 595511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 595611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 595711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list->entryList->entry; 595811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx", 595911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_info->pmem_fd); 596011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd; 596111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset; 596211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 596311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].mmaped_size = 596411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 596511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = appData; 596611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 596711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 596811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd; 596911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len; 597011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size; 597111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr; 597211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 597311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_out_mem_ptr + i ); 597411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode) 597511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 597611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 597711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i], 597811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof (vdec_bufferpayload)); 597911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 598011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i, 598111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr, 598211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd ); 598311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 598411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = i; 598511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 598611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 598711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = drv_ctx.op_buf.buffer_size; 598811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 598911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 599011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd; 599111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 599211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = 0; 599311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 599411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 599511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 599611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 599711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 599811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 599911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 600011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 600111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].data_offset = 0; 600211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 600311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 600411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 600511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 600611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = plane; 600711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = drv_ctx.num_planes; 600811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 600911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) { 601011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to prepare bufs"); 601111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 601211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 601311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 601411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 601511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) { 601611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 601711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 601811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) { 601911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 602011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 602111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = true; 602211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("STREAMON Successful"); 602311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 602411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 602511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enabling Turbo mode"); 602611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel request_perf_level(VIDC_TURBO); 602711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 602811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 602911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size; 603011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 603111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle); 603211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = (OMX_U8 *)handle; 603311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 603411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = buff; 603511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 603611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pAppPrivate = privateAppData; 603711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_out_bm_count,i); 603811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 603911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 604011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 604111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 604211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 604311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 604411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::use_input_heap_buffers 604511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 604611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 604711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Use Buffer Heap allocation method implementation. 604811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 604911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 605011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 605111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 605211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 605311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None , if everything successful. 605411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 605511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 605611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_input_heap_buffers( 605711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 605811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 605911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 606011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 606111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 606211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 606311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 606411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer); 606511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 60667b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan 60677b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan if (secure_mode) { 60687b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan DEBUG_PRINT_ERROR("use_input_heap_buffers is not allowed in secure mode"); 60697b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan return OMX_ErrorUndefined; 60707b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan } 60717b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan 607211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_inp_heap_ptr) 607311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 607411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 607511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 607611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_phdr_pmem_ptr) 607711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 607811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 607911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 608011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) { 608111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Insufficent memory"); 608211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 608311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) { 608411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer = true; 608511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 608611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 608711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 608811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 608911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 609011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 609111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 609211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes); 609311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]); 609411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[m_in_alloc_cnt], 609511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL, (unsigned)NULL)) { 609611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 609711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 609811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 609911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_in_alloc_cnt++; 610011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 610111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("All i/p buffers have been set!"); 610211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 610311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 610411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 610511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 610611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 610711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 610811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 610911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::UseBuffer 611011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 611111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 611211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Use Buffer method implementation. 611311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 611411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 611511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 611611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 611711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 611811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None , if everything successful. 611911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 612011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 612111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_buffer( 612211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 612311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 612411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 612511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 612611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 612711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 612811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 612911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE error = OMX_ErrorNone; 613011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_setbuffer_cmd setbuffers; 613111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 613211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL || bytes == 0 || (!secure_mode && buffer == NULL)) { 613311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("bad param 0x%p %u 0x%p",bufferHdr, (unsigned int)bytes, buffer); 613411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 613511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 613611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 613711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Use Buffer in Invalid State"); 613811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 613911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 6140fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX) { 6141fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // If this is not the first allocation (i.e m_inp_mem_ptr is allocated), 6142fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // ensure that use-buffer was called for previous allocation. 6143fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Mix-and-match of useBuffer and allocateBuffer is not allowed 6144fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_inp_mem_ptr && !input_use_buffer) { 6145fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("'Use' Input buffer called after 'Allocate' Input buffer !"); 6146fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUndefined; 6147fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 614811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer); 6149fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) 615011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested 615111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 615211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port); 615311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel error = OMX_ErrorBadPortIndex; 615411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 615511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", (unsigned int)port, *bufferHdr, error); 615611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (error == OMX_ErrorNone) { 615711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 615811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 615911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 616011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandStateSet,OMX_StateIdle, 616111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 616211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 616311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated && 616411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 616511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 616611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 616711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX, 616811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 616911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated && 617011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 617111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 617211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 617311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, 617411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 617511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 617611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 617711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return error; 617811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 617911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 618011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex, 618111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *pmem_bufferHdr) 618211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 618311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) { 618411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_heap_ptr[bufferindex].pBuffer) 618511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_inp_heap_ptr[bufferindex].pBuffer); 618611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[bufferindex].pBuffer = NULL; 618711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 618811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_bufferHdr) 618911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer(pmem_bufferHdr); 619011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 619111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 619211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 619311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 619411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 619511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = 0; 619611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL || m_inp_mem_ptr == NULL) { 619711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 619811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 619911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 620011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufferHdr - m_inp_mem_ptr; 620111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); 620211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 620311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel auto_lock l(buf_lock); 620411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferHdr->pInputPortPrivate = NULL; 620511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 620611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) { 620711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Input Buffer index = %d",index); 620811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_inputbuffer[index].pmem_fd >= 0) { 620911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_setbuffer_cmd setbuffers; 621011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT; 621111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index], 621211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof (vdec_bufferpayload)); 621311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 621411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("unmap the input buffer fd=%d", 621511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].pmem_fd); 621611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("unmap the input buffer size=%u address = %p", 621711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.ptr_inputbuffer[index].mmaped_size, 621811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].bufferaddr); 621911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr, 622011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].mmaped_size); 6221d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel } 6222d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel 6223d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel if (allocate_native_handle){ 622411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_handle_t *nh = (native_handle_t *)bufferHdr->pBuffer; 622511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_handle_close(nh); 622611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_handle_delete(nh); 6227d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel } else { 6228d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel // Close fd for non-secure and secure non-native-handle case 6229d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel close(drv_ctx.ptr_inputbuffer[index].pmem_fd); 623011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 623111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].pmem_fd = -1; 6232d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel 623311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) { 623411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_desc_buffer_ptr[index].buf_addr); 623511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_desc_buffer_ptr[index].buf_addr = NULL; 623611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_desc_buffer_ptr[index].desc_data_size = 0; 623711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 623811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 623911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.ip_buf_ion_info[index]); 624011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 624111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 624211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 624311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 624411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 624511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 624611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 624711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 624811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 624911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = 0; 625011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 625111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL || m_out_mem_ptr == NULL) { 625211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 625311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 625411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 625511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufferHdr - m_out_mem_ptr; 625611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index); 625711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 625811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < drv_ctx.op_buf.actualcount 625911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && drv_ctx.ptr_outputbuffer) { 626011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %p", index, 626111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].bufferaddr); 626211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 626311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_setbuffer_cmd setbuffers; 626411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT; 626511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index], 626611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof (vdec_bufferpayload)); 626711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 626811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dynamic_buf_mode) { 626911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (streaming[CAPTURE_PORT] && 627011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !(in_reconfig || BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING))) { 627111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) { 627211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("STREAMOFF Failed"); 627311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 627411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("STREAMOFF Successful"); 627511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 627611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 627711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 627811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 627911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 628011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) { 628111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr, 628211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].mmaped_size); 628311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 628411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 628511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 628611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 628711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 628811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) { 628911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 629011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("unmap the output buffer fd = %d", 629111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[0].pmem_fd); 629211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("unmap the ouput buffer size=%u address = %p", 629311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount, 629411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[0].bufferaddr); 629511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr, 629611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount); 629711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 629811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close (drv_ctx.ptr_outputbuffer[0].pmem_fd); 629911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[0].pmem_fd = -1; 630011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 630111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.op_buf_ion_info[0]); 630211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 630311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 630411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 630511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 630611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 630711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } //!dynamic_buf_mode 630811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_output_done()) { 630911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_extradata(); 631011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 631111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 631211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 631311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 631411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 631511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 631611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 631711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 631811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE **bufferHdr, 631911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 port, 632011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR appData, 632111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 bytes) 632211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 632311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *input = NULL; 632411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *buf_addr = NULL; 632511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 632611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 632711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 632811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Sanity Check*/ 632911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL) { 633011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 633111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 633211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 633311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_heap_ptr == NULL) { 633411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \ 633511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 633611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 633711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \ 633811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 633911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 634011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 634111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_heap_ptr == NULL || m_phdr_pmem_ptr == NULL) { 634211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("m_inp_heap_ptr or m_phdr_pmem_ptr Allocation failed "); 634311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 634411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 634511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 634611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 634711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Find a Free index*/ 634811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 634911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) { 635011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Input Buffer Index %d",i); 635111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 635211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 635311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 635411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 635511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < drv_ctx.ip_buf.actualcount) { 635611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size); 635711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 635811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_addr == NULL) { 635911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 636011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 636111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 636211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_inp_heap_ptr + i); 636311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input = *bufferHdr; 636411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_heap_inp_bm_count,i); 636511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 636611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pBuffer = (OMX_U8 *)buf_addr; 636711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 636811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nVersion.nVersion = OMX_SPEC_VERSION; 636911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nAllocLen = drv_ctx.ip_buf.buffer_size; 637011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pAppPrivate = appData; 637111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 637211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr ); 637311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes); 637411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]); 637511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Add the Buffers to freeq*/ 637611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[i], 637711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL, (unsigned)NULL)) { 637811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 637911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 638011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 638111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 638211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 638311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 638411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 638511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 638611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 638711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 638811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 638911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 639011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 639111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 639211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::AllocateInputBuffer 639311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 639411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 639511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Helper function for allocate buffer in the input pin 639611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 639711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 639811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 639911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 640011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 640111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 640211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 640311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 640411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_input_buffer( 640511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 640611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 640711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 640811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 640911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes) 641011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 641111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 641211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_setbuffer_cmd setbuffers; 641311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *input = NULL; 641411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 641511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *buf_addr = NULL; 641611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pmem_fd = -1; 641711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 641811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 641911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) port; 642011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 642111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 642211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bytes != drv_ctx.ip_buf.buffer_size) { 642311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Requested Size is wrong %u epected is %u", 642411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)bytes, (unsigned int)drv_ctx.ip_buf.buffer_size); 642511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 642611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 642711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 642811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_inp_mem_ptr) { 642911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%u)", 643011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount, 643111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.ip_buf.buffer_size); 643211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 643311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 643411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 643511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 643611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr == NULL) { 643711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 643811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 643911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 644011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \ 644111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount); 644211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 644311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_inputbuffer == NULL) { 644411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 644511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 644611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 644711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \ 644811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount); 644911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 645011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ip_buf_ion_info == NULL) { 645111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 645211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 645311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 645411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 645511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i < drv_ctx.ip_buf.actualcount; i++) { 645611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].pmem_fd = -1; 645711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 645811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1; 645911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 646011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 646111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 646211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 646311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< drv_ctx.ip_buf.actualcount; i++) { 646411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 646511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Input Buffer Index %d",i); 646611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 646711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 646811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 646911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 647011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < drv_ctx.ip_buf.actualcount) { 647111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 647211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane; 647311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 647411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocate input Buffer"); 647511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 647611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 647711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment, 647811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.ip_buf_ion_info[i].ion_alloc_data, 647911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? 648011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SECURE_FLAGS_INPUT_BUFFER : ION_FLAG_CACHED); 648111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) { 648211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 648311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 648411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd; 648511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 648611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = open (MEM_DEVICE,O_RDWR); 648711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 648811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_fd < 0) { 648911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer"); 649011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 649111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 649211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 649311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_fd == 0) { 649411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = open (MEM_DEVICE,O_RDWR); 649511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 649611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_fd < 0) { 649711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer"); 649811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 649911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 650011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 650111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 650211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size, 650311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.alignment)) { 650411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 650511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd); 650611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 650711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 650811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 650911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 651011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_addr = (unsigned char *)mmap(NULL, 651111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size, 651211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0); 651311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 651411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_addr == MAP_FAILED) { 651511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd); 651611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 651711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.ip_buf_ion_info[i]); 651811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 651911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Map Failed to allocate input buffer"); 652011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 652111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 652211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 652311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_inp_mem_ptr + i); 652411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode) 652511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr; 652611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 652711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr; 652811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd; 652911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 653011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size; 653111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].offset = 0; 653211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 653311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 653411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = i; 653511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 653611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 653711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.bytesused = 0; 653811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size; 653911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr; 654011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd; 654111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.reserved[1] = 0; 654211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset; 654311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = &plane; 654411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = 1; 654511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 654611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %p", i, 654711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[i].bufferaddr); 654811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 654911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 655011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 655111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 655211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to prepare bufs"); 655311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 655411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 655511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 655611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 655711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input = *bufferHdr; 655811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_inp_bm_count,i); 655911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr); 656011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocate_native_handle) { 656111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_handle_t *nh = native_handle_create(1 /*numFds*/, 0 /*numInts*/); 656211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!nh) { 656311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Native handle create failed"); 656411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 656511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 656611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nh->data[0] = drv_ctx.ptr_inputbuffer[i].pmem_fd; 656711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pBuffer = (OMX_U8 *)nh; 656811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (secure_mode || m_input_pass_buffer_fd) { 656911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Legacy method, pass ion fd stashed directly in pBuffer*/ 657011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pBuffer = (OMX_U8 *)(intptr_t)drv_ctx.ptr_inputbuffer[i].pmem_fd; 657111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 657211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pBuffer = (OMX_U8 *)buf_addr; 657311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 657411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 657511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nVersion.nVersion = OMX_SPEC_VERSION; 657611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nAllocLen = drv_ctx.ip_buf.buffer_size; 657711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pAppPrivate = appData; 657811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 657911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; 658011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 658111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.disable_dmx) { 658211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_desc_buffer(i); 658311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 658411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 658511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found"); 658611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 658711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 658811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 658911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 659011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 659111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 659211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 659311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 659411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::AllocateOutputBuffer 659511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 659611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 659711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Helper fn for AllocateBuffer in the output pin 659811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 659911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 660011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 660111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 660211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 660311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything went well. 660411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 660511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 660611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_output_buffer( 660711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 660811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 660911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 661011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 661111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes) 661211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 661311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 661411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)port; 661511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 661611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 661711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i= 0; // Temporary counter 661811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_setbuffer_cmd setbuffers; 661911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 662011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 662111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ion_device_fd =-1; 662211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_allocation_data ion_alloc_data; 662311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_fd_data fd_ion_data; 662411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 662511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_out_mem_ptr) { 662611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%u)", 662711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount, 662811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.op_buf.buffer_size); 662911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nBufHdrSize = 0; 663011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPlatformEntrySize = 0; 663111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPlatformListSize = 0; 663211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPMEMInfoSize = 0; 663311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pmem_fd = -1; 663411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *pmem_baseaddress = NULL; 663511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 663611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 663711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 663811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 663911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 664011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)", 664111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 664211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufHdrSize = drv_ctx.op_buf.actualcount * 664311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_BUFFERHEADERTYPE); 664411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 664511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPMEMInfoSize = drv_ctx.op_buf.actualcount * 664611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 664711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPlatformListSize = drv_ctx.op_buf.actualcount * 664811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 664911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPlatformEntrySize = drv_ctx.op_buf.actualcount * 665011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 665111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 665211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize, 665311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)sizeof(OMX_BUFFERHEADERTYPE), 665411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPMEMInfoSize, 665511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPlatformListSize); 665611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize, 665711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 665811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 665911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Allocate output buffers as cached to improve performance of software-reading 666011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // of the YUVs. Output buffers are cache-invalidated in driver. 666111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // If color-conversion is involved, Only the C2D output buffers are cached, no 666211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // need to cache the decoder's output buffers 666311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int cache_flag = client_buffers.is_color_conversion_enabled() ? 0 : ION_FLAG_CACHED; 666411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_device_fd = alloc_map_ion_memory( 666511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount, 666611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_scaling_to_non_secure_opb ? SZ_4K : drv_ctx.op_buf.alignment, 666711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &ion_alloc_data, &fd_ion_data, 666811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (secure_mode && !secure_scaling_to_non_secure_opb) ? 666911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SECURE_FLAGS_OUTPUT_BUFFER : cache_flag); 667011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ion_device_fd < 0) { 667111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 667211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 667311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = fd_ion_data.fd; 667411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 667511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = open (MEM_DEVICE,O_RDWR); 667611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 667711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_fd < 0) { 667811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d", 667911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size); 668011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 668111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 668211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 668311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size * 668411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount, 668511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.alignment)) { 668611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("align_pmem_buffers() failed"); 668711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd); 668811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 668911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 669011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 669111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 669211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_baseaddress = (unsigned char *)mmap(NULL, 669311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.op_buf.buffer_size * 669411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount), 669511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0); 669611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_baseaddress == MAP_FAILED) { 669711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("MMAP failed for Size %u", 669811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.op_buf.buffer_size); 669911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd); 670011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 670111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 670211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 670311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 670411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 670511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 670611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 670711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Alloc mem for platform specific info 670811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char *pPtr=NULL; 670911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 671011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPMEMInfoSize,1); 671111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\ 671211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct vdec_bufferpayload), 671311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 671411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 671511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof (struct vdec_output_frameinfo), 671611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 671711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) { 671811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer "); 671911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 672011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 672111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 672211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 672311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = (struct vdec_ion *)\ 672411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct vdec_ion), 672511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 672611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.op_buf_ion_info) { 672711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info"); 672811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 672911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 673011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 673111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 673211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 673311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && drv_ctx.ptr_respbuffer) { 673411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[0].mmaped_size = 673511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.op_buf.buffer_size * 673611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 673711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr = m_out_mem_ptr; 673811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 673911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 674011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((char *) m_platform_list) + nPlatformListSize); 674111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 674211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((char *) m_platform_entry) + nPlatformEntrySize); 674311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList = m_platform_list; 674411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry = m_platform_entry; 674511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo = m_pmem_info; 674611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 674711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 674811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 674911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Settting the entire storage nicely 675011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry); 675111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo); 675211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 675311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 675411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 675511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Set the values when we determine the right HxW param 675611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nAllocLen = bytes; 675711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nFilledLen = 0; 675811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pAppPrivate = appData; 675911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 676011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Platform specific PMEM Information 676111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Initialize the Platform Entry 676211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i); 676311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 676411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry->entry = pPMEMInfo; 676511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Initialize the Platform List 676611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList->nEntries = 1; 676711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList->entryList = pPlatformEntry; 676811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Keep pBuffer NULL till vdec is opened 676911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pBuffer = NULL; 677011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nOffset = 0; 677111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 677211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo->offset = drv_ctx.op_buf.buffer_size*i; 677311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo->pmem_fd = -1; 677411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pPlatformPrivate = pPlatformList; 677511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 677611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd; 677711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].pmem_fd = pmem_fd; 677811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 677911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd; 678011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data; 678111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data; 678211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 678311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 678411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Create a mapping between buffers*/ 678511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 678611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer[i].client_data = (void *)\ 678711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.ptr_outputbuffer[i]; 678811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i; 678911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = 679011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i); 679111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len; 679211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size; 679311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr; 679411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 679511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("pmem_fd = %d offset = %u address = %p", 679611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd, (unsigned int)drv_ctx.ptr_outputbuffer[i].offset, 679711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr); 679811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Move the buffer and buffer header pointers 679911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr++; 680011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo++; 680111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry++; 680211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList++; 680311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 680411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 680511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\ 680611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr, pPtr); 680711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 680811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_out_mem_ptr); 680911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = NULL; 681011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 681111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pPtr) { 681211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(pPtr); 681311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPtr = NULL; 681411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 681511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer) { 681611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ptr_outputbuffer); 681711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = NULL; 681811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 681911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_respbuffer) { 682011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ptr_respbuffer); 682111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = NULL; 682211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 682311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 682411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.op_buf_ion_info) { 682511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free o/p ion context"); 682611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.op_buf_ion_info); 682711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = NULL; 682811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 682911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 683011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 683111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 683211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) 683311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_extradata(); 683411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 683511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 683611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< drv_ctx.op_buf.actualcount; i++) { 683711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_out_bm_count,i)) { 683811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i); 683911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 684011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 684111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 684211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 684311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 684411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < drv_ctx.op_buf.actualcount) { 684511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 684611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 684711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 684811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset; 684911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 685011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].buffer_len = 685111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size; 685211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 685311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_out_mem_ptr + i ); 685411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode) { 685511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 685611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = 685711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_U8 *)(intptr_t)drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 685811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 685911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr; 686011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 686111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 686211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size; 686311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 686411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = i; 686511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 686611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 686711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = drv_ctx.op_buf.buffer_size; 686811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr - 686911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)drv_ctx.ptr_outputbuffer[i].offset; 687011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 687111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 687211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 687311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset; 687411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = 0; 687511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 687611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 687711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 687811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size); 687911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 688011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 688111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 688211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size; 688311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].data_offset = 0; 688411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 688511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx); 688611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 688711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 688811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = plane; 688911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = drv_ctx.num_planes; 689011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr); 689111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf); 689211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 689311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 689411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 689511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 689611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 689711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) { 689811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 689911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 690011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 690111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 690211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 690311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 690411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = true; 690511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("STREAMON Successful"); 690611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 690711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 690811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enabling Turbo mode"); 690911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel request_perf_level(VIDC_TURBO); 691011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 691111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 691211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr; 691311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pAppPrivate = appData; 691411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_out_bm_count,i); 691511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 691611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient"); 691711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 691811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 691911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 692011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 692111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 692211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 692311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 692411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 692511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// AllocateBuffer -- API Call 692611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 692711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 692811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::AllocateBuffer 692911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 693011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 693111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns zero if all the buffers released.. 693211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 693311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 693411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 693511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 693611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 693711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 693811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 693911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 694011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp, 694111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 694211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 694311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 694411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes) 694511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 694611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 694711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type 694811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 694911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port); 695011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 695111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Allocate Buf in Invalid State"); 695211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 695311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 695411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 695511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX) { 6956fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // If this is not the first allocation (i.e m_inp_mem_ptr is allocated), 6957fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // ensure that use-buffer was never called. 6958fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Mix-and-match of useBuffer and allocateBuffer is not allowed 6959fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_inp_mem_ptr && input_use_buffer) { 6960fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("'Allocate' Input buffer called after 'Use' Input buffer !"); 6961fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUndefined; 6962fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 696311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 696411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes); 696511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 696611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes); 696711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 696811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 696911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port, 697011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel appData,bytes); 697111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 697211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port); 697311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 697411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 697511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done"); 697611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 697711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocate_done()) { 697811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 697911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 698011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 698111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandStateSet,OMX_StateIdle, 698211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 698311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 698411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 698511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) { 698611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 698711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 698811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 698911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX, 699011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 699111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 699211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 699311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) { 699411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 699511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 699611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 699711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, 699811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 699911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 700011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 700111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 700211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet); 700311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 700411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 700511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 700611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Free Buffer - API call 700711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 700811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 700911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::FreeBuffer 701011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 701111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 701211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 701311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 701411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 701511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 701611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 701711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 701811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 701911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 702011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE hComp, 702111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 702211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 702311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 702411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 702511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int nPortIndex; 702611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 702711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("In for decoder free_buffer"); 702811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 702911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateIdle && 703011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 703111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" free buffer while Component in Loading pending"); 703211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)|| 703311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) { 703411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Buffer while port %u disabled", (unsigned int)port); 703511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((port == OMX_CORE_INPUT_PORT_INDEX && 703611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) || 703711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (port == OMX_CORE_OUTPUT_PORT_INDEX && 703811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) { 703911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Buffer while port %u enable pending", (unsigned int)port); 704011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) { 704111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled"); 704211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError, 704311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorPortUnpopulated, 704411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 704511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 704611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 704711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_state != OMX_StateInvalid) { 704811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers"); 704911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError, 705011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorPortUnpopulated, 705111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 705211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 705311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 705411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX) { 705511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if arbitrary bytes*/ 705611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!arbitrary_bytes && !input_use_buffer) 705711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - m_inp_mem_ptr; 705811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 705911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - m_inp_heap_ptr; 706011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 706111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex); 706211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nPortIndex < drv_ctx.ip_buf.actualcount && 706311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_inp_bm_count, nPortIndex)) { 706411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Clear the bit associated with it. 706511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); 706611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex); 706711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_use_buffer == true) { 706811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 706911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex); 707011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_phdr_pmem_ptr) 707111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer(m_phdr_pmem_ptr[nPortIndex]); 707211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 707311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 707411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_phdr_pmem_ptr) 707511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]); 707611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 707711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer(nPortIndex,NULL); 707811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 707911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer(buffer); 708011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 708111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bPopulated = OMX_FALSE; 708211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(release_input_done()) 708311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel release_buffers(this, VDEC_BUFFER_TYPE_INPUT); 708411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Free the Buffer Header*/ 708511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_input_done()) { 708611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ALL input buffers are freed/released"); 708711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer_header(); 708811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 708911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 709011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid"); 709111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 709211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 709311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 709411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING) 709511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_input_done()) { 709611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 709711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING); 709811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable, 709911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX, 710011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 710111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 710211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 710311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // check if the buffer is valid 710411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 710511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nPortIndex < drv_ctx.op_buf.actualcount && 710611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_out_bm_count, nPortIndex)) { 710711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex); 710811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Clear the bit associated with it. 710911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_out_bm_count,nPortIndex); 711011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bPopulated = OMX_FALSE; 711111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_buffers.free_output_buffer (buffer); 711211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 711311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(release_output_done()) { 711411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel release_buffers(this, VDEC_BUFFER_TYPE_OUTPUT); 711511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 711611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_output_done()) { 711711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_output_buffer_header(); 711811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 711911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 712011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid"); 712111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 712211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 712311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING) 712411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_output_done()) { 712511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it"); 712611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 712711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 712811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 712911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 713011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 713111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers"); 713211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 713311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 713411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 713511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 713611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable, 713711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, 713811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 713911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 714011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 714111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 714211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 714311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((eRet == OMX_ErrorNone) && 714411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 714511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_done()) { 714611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 714711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); 714811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandStateSet, OMX_StateLoaded, 714911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 715011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 715111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 715211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 715311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 715411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 715511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 715611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 715711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 715811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::EmptyThisBuffer 715911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 716011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 716111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel This routine is used to push the encoded video frames to 716211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel the video decoder. 716311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 716411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 716511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 716611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 716711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 716811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything went successful. 716911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 717011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 717111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 717211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 717311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 717411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret1 = OMX_ErrorNone; 717511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount; 717611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 717711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateExecuting && 717811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state != OMX_StatePause && 717911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state != OMX_StateIdle) { 718011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Empty this buffer in Invalid State"); 718111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 718211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 718311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 718411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL) { 718511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL"); 718611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 718711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 718811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 718911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_inp_bEnabled) { 719011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled."); 719111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 719211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 719311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 719411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) { 719511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %u", (unsigned int)buffer->nInputPortIndex); 719611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 719711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 719811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 719911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (perf_flag) { 720011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!latency) { 720111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec_time.stop(); 720211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel latency = dec_time.processing_time_us(); 720311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec_time.start(); 720411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 720511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 720611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 720711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 720811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufferIndex = buffer - m_inp_heap_ptr; 720911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 721011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_use_buffer == true) { 721111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufferIndex = buffer - m_inp_heap_ptr; 7212fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) { 7213fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("ERROR: ETB nBufferIndex is invalid in use-buffer mode"); 7214fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorBadParameter; 7215fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 721611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen; 721711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp; 721811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags; 721911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer = &m_inp_mem_ptr[nBufferIndex]; 722011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %u", 722111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, (unsigned int)buffer->nFilledLen); 722211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 722311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufferIndex = buffer - m_inp_mem_ptr; 722411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 722511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 722611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7227fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) { 722811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid"); 722911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 723011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 723111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 723211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 723311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_config_flag = true; 723411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__); 723511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 723611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 723711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* The client should not set this when codec is in arbitrary bytes mode */ 723811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pass_buffer_fd) { 723911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->pBuffer = (OMX_U8*)drv_ctx.ptr_inputbuffer[nBufferIndex].bufferaddr; 724011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 724111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 724211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%u)", 724311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer, buffer->pBuffer, buffer->nTimeStamp, (unsigned int)buffer->nFilledLen); 724411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 724511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)hComp,(unsigned long)buffer, 724611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_ETB_ARBITRARY); 724711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 724811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)hComp,(unsigned long)buffer,OMX_COMPONENT_GENERATE_ETB); 724911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 725011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.insert_timestamp(buffer); 725111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 725211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 725311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 725411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 725511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 725611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::empty_this_buffer_proxy 725711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 725811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 725911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel This routine is used to push the encoded video frames to 726011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel the video decoder. 726111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 726211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 726311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 726411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 726511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 726611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything went successful. 726711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 726811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 726911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, 727011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 727111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 7272b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_HIGH("ETB"); 727311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 727411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int push_cnt = 0,i=0; 727511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned nPortIndex = 0; 727611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 727711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_input_frameinfo frameinfo; 727811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_bufferpayload *temp_buffer; 727911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_seqheader seq_header; 728011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool port_setting_changed = true; 728111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 728211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Should we generate a Aync error event*/ 728311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL || buffer->pInputPortPrivate == NULL) { 728411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid"); 728511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 728611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 728711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 728811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 728911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7290fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (nPortIndex >= drv_ctx.ip_buf.actualcount) { 729111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]", 729211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex); 729311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 729411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 729511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 729611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers++; 7297b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 729811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 729911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* return zero length and not an EOS buffer */ 730011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!arbitrary_bytes && (buffer->nFilledLen == 0) && 730111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) { 730211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("return zero legth buffer"); 730311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer,VDEC_S_SUCCESS, 730411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 730511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 730611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 730711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 730811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_flush_progress == true) { 730911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Flush in progress return buffer "); 731011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer,VDEC_S_SUCCESS, 731111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 731211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 731311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 731411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 731511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel auto_lock l(buf_lock); 731611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate; 731711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 731811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!temp_buffer || (temp_buffer - drv_ctx.ptr_inputbuffer) > (int)drv_ctx.ip_buf.actualcount) { 731911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 732011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 732111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* If its first frame, H264 codec and reject is true, then parse the nal 732211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel and get the profile. Based on this, reject the clip playback */ 732311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 && 732411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_reject_avc_1080p_mp) { 732511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel first_frame = 1; 732611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Parse nal to get the profile"); 732711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser->parse_nal((OMX_U8*)buffer->pBuffer, buffer->nFilledLen, 732811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NALU_TYPE_SPS); 732911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile = h264_parser->get_profile(); 733011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = is_video_session_supported(); 733111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 733211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_EBD); 733311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError, OMX_ErrorInvalidState,OMX_COMPONENT_GENERATE_EVENT); 733411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Move the state to Invalid to avoid queueing of pending ETB to the driver */ 733511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StateInvalid; 733611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 733711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 733811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 733911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7340b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-TS", buffer->nTimeStamp / 1000); 7341b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-size", buffer->nFilledLen); 734211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 734311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*for use buffer we need to memcpy the data*/ 734411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp_buffer->buffer_len = buffer->nFilledLen; 734511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73467b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan if (input_use_buffer && temp_buffer->bufferaddr && !secure_mode) { 734711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFilledLen <= temp_buffer->buffer_len) { 734811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 734911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen); 735011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 735111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset), 735211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen); 735311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 735411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 735511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 735611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 735711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 735811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 735911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 736011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.bufferaddr = temp_buffer->bufferaddr; 736111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.client_data = (void *) buffer; 736211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.datalen = temp_buffer->buffer_len; 736311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.flags = 0; 736411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.offset = buffer->nOffset; 736511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.pmem_fd = temp_buffer->pmem_fd; 736611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.pmem_offset = temp_buffer->offset; 736711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.timestamp = buffer->nTimeStamp; 736811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) { 736911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETB: dmx enabled"); 737011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_demux_entries == 0) { 737111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extract_demux_addr_offsets(buffer); 737211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 737311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 737411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%u",(unsigned int)m_demux_entries); 737511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle_demux_data(buffer); 737611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr; 737711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size; 737811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 737911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.desc_addr = NULL; 738011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.desc_size = 0; 738111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 738211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!arbitrary_bytes) { 738311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.flags |= buffer->nFlags; 738411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 738511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 738611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 738711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_timestamp) { 738811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 738911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 739011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.insert_ts(buffer->nTimeStamp); 739111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 739211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp); 739311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.insert_ts(buffer->nTimeStamp); 739411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 739511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 739611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 739711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 739811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel log_input_buffers((const char *)temp_buffer->bufferaddr, temp_buffer->buffer_len); 739911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 740011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelif (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { 740111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 740211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 740311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 740411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 740511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 740611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached"); 740711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.flags |= VDEC_BUFFERFLAG_EOS; 740811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 740911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count = 0; 741011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = false; 741111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count = 0; 741211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils) 741311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->initialize_frame_checking_environment(); 741411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.flush(); 741511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts = LLONG_MAX; 741611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_flags = 0; 741711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 741811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_entries = 0; 741911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 742011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 742111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane; 742211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset( (void *)&buf, 0, sizeof(buf)); 742311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset( (void *)&plane, 0, sizeof(plane)); 742411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 742511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long print_count; 742611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 742711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags = V4L2_QCOM_BUF_FLAG_EOS; 742811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("INPUT EOS reached") ; 742911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 743011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 743111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = nPortIndex; 743211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 743311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 743411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.bytesused = temp_buffer->buffer_len; 743511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.length = drv_ctx.ip_buf.buffer_size; 743611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.m.userptr = (unsigned long)temp_buffer->bufferaddr - 743711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)temp_buffer->offset; 743811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.reserved[0] = temp_buffer->pmem_fd; 743911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.reserved[1] = temp_buffer->offset; 744011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane.data_offset = 0; 744111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = &plane; 744211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = 1; 744311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frameinfo.timestamp >= LLONG_MAX) { 744411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID; 744511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 744611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //assumption is that timestamp is in milliseconds 744711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.timestamp.tv_sec = frameinfo.timestamp / 1000000; 744811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000); 744911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0; 745011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_DECODEONLY) ? V4L2_QCOM_BUF_FLAG_DECODEONLY: 0; 745111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 745211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 745311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Increment codec_config buffer counter"); 745411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel android_atomic_inc(&m_queued_codec_config_count); 745511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 745611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 745711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 745811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 745911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver, send ETB back to client"); 746011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(hComp, m_app_data, buffer); 746111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 746211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 746311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 746411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 746511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_config_flag = false; 746611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 746711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!streaming[OUTPUT_PORT]) { 746811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 746911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret,r; 747011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 747111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 747211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 747311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type); 747411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ret) { 747511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful"); 747611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[OUTPUT_PORT] = true; 747711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (errno == EBUSY) { 747811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call stream on OUTPUT due to HW_OVERLOAD"); 747911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer, VDEC_S_SUCCESS, 748011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 748111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 748211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 748311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT"); 748411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued"); 748511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer, VDEC_S_SUCCESS, 748611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 748711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 748811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 748911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 749011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%u)", 749111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frameinfo.bufferaddr, (long long)frameinfo.timestamp, 749211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)frameinfo.datalen); 749311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 749411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 749511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 749611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 749711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 749811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 749911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::FillThisBuffer 750011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 750111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 750211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel IL client uses this method to release the frame buffer 750311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel after displaying them. 750411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 750511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 750611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 750711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 750811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 750911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 751011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 751111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 751211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 751311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 751411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 751511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateExecuting && 751611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state != OMX_StatePause && 751711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state != OMX_StateIdle) { 751811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FTB in Invalid State"); 751911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 752011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 752111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 752211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_out_bEnabled) { 752311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled."); 752411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 752511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 752611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 752711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned nPortIndex = 0; 752811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dynamic_buf_mode) { 752911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = NULL; 753011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct VideoDecoderOutputMetaData *meta; 753111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int nPortIndex = 0; 753211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 753311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!buffer || !buffer->pBuffer) { 753411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: invalid params: %p", __FUNCTION__, buffer); 753511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 753611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 753711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 753811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //get the buffer type and fd info 753911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta = (struct VideoDecoderOutputMetaData *)buffer->pBuffer; 754011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)meta->pHandle; 754111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FTB: metabuf: %p buftype: %d bufhndl: %p ", meta, meta->eType, meta->pHandle); 754211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 754311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!handle) { 754411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FTB: Error: IL client passed an invalid buf handle - %p", handle); 754511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 754611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 754711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Fill outputbuffer with buffer details, this will be sent to f/w during VIDIOC_QBUF 754811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 754911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nPortIndex < drv_ctx.op_buf.actualcount && 755011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) { 755111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd = handle->fd; 755211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = (OMX_U8*) buffer; 755311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 755411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Store private handle from GraphicBuffer 755511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[nPortIndex].privatehandle = handle; 755611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[nPortIndex].nativehandle = handle; 755711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 755811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("[FTB]Invalid native_buffer index: %d", nPortIndex); 755911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 756011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 756111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 756211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //buffer->nAllocLen will be sizeof(struct VideoDecoderOutputMetaData). Overwrite 756311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //this with a more sane size so that we don't compensate in rest of code 756411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //We'll restore this size later on, so that it's transparent to client 756511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 756611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nAllocLen = handle->size; 756711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 756811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (handle->flags & private_handle_t::PRIV_FLAGS_DISP_CONSUMER) { 756911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_is_display_session = true; 757011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 757111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_is_display_session = false; 757211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 757311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s: m_is_display_session = %d", __func__, m_is_display_session); 757411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 757511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size = handle->size; 757611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 757711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 757811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - client_buffers.get_il_buf_hdr(); 757911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL || 758011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (nPortIndex >= drv_ctx.op_buf.actualcount)) { 758111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index, nPortIndex %u bufCount %u", 758211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex, drv_ctx.op_buf.actualcount); 758311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 758411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 758511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 758611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) { 758711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %u", (unsigned int)buffer->nOutputPortIndex); 758811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 758911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 759011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 759111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 759211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event((unsigned long) hComp, (unsigned long)buffer, m_fill_output_msg); 759311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 759411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 759511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 759611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 759711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::fill_this_buffer_proxy 759811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 759911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 760011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel IL client uses this method to release the frame buffer 760111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel after displaying them. 760211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 760311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 760411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 760511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 760611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 760711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 760811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 760911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 761011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( 761111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 761211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd) 761311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 7614b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_HIGH("FTB"); 761511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE nRet = OMX_ErrorNone; 761611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *buffer = bufferAdd; 761711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned nPortIndex = 0; 761811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_fillbuffer_cmd fillbuffer; 761911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_bufferpayload *ptr_outputbuffer = NULL; 762011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_output_frameinfo *ptr_respbuffer = NULL; 762111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 762211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 762311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7624fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (bufferAdd == NULL || nPortIndex >= drv_ctx.op_buf.actualcount) { 762511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u", 762611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex, drv_ctx.op_buf.actualcount); 762711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 762811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 762911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 763011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p", 763111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferAdd, bufferAdd->pBuffer); 763211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Return back the output buffer to client*/ 763311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true || in_reconfig) { 763411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Output Buffers return flush/disable condition"); 763511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 763611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone (hComp,m_app_data,buffer); 763711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 763811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 763911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 764011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dynamic_buf_mode) { 764111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].offset = 0; 764211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len = buffer->nAllocLen; 764311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ref_add(nPortIndex); 764411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].mmaped_size = buffer->nAllocLen; 764511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 764611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 764711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers++; 7648b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers); 764911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer = client_buffers.get_dr_buf_hdr(bufferAdd); 765011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!buffer) { 765111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("err: client_buffer ptr invalid"); 765211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 765311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 765411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate; 765511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ptr_respbuffer) { 765611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data; 765711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 765811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 765911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) { 766011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL"); 766111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 766211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone (hComp,m_app_data,buffer); 766311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers--; 7664b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers); 766511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 766611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 766711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 766811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 766911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 767011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 767111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset( (void *)&buf, 0, sizeof(buf)); 767211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES)); 767311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int extra_idx = 0; 767411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 767511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = nPortIndex; 767611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 767711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 767811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].bytesused = buffer->nFilledLen; 767911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = buffer->nAllocLen; 768011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = 768111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr - 768211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset; 768311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 768411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset; 768511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = 0; 768611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 768711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 768811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].bytesused = 0; 768911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = drv_ctx.extradata_info.buffer_size; 769011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size); 769111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 769211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd; 769311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 769411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size; 769511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].data_offset = 0; 769611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 769711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx); 769811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 769911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 770011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = plane; 770111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = drv_ctx.num_planes; 770211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("SENDING FTB TO F/W - fd[0] = %d fd[1] = %d offset[1] = %d in_flush = %d", 770311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], output_flush_progress); 770411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 770511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf); 770611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 770711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 770811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 770911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to qbuf to driver, send FTB back to client"); 771011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone(hComp, m_app_data, buffer); 771111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 771211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelreturn OMX_ErrorNone; 771311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 771411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 771511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 771611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 771711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::SetCallbacks 771811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 771911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 772011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Set the callbacks. 772111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 772211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 772311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 772411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 772511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 772611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 772711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 772811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 772911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE hComp, 773011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_CALLBACKTYPE* callbacks, 773111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData) 773211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 773311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 773411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb = *callbacks; 773511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\ 773611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EventHandler,m_cb.FillBufferDone); 773711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data = appData; 773811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 773911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 774011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 774111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 774211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 774311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ComponentDeInit 774411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 774511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 774611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Destroys the component and release memory allocated to the heap. 774711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 774811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 774911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 775011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 775111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 775211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 775311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 775411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 775511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp) 775611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 775711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 775811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 775911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 776011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_StateLoaded != m_state) { 776111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\ 776211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state); 776311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Playback Ended - FAILED"); 776411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 776511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Playback Ended - PASSED"); 776611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 776711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 776811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if the output buffers have to be cleaned up*/ 776911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 777011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Freeing the Output Memory"); 777111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) { 777211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_out_bm_count, i)) { 777311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_out_bm_count, i); 777411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_buffers.free_output_buffer (&m_out_mem_ptr[i]); 777511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 777611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 777711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_output_done()) { 777811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 777911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 778011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 778111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 778211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 778311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 778411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 778511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 778611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if the input buffers have to be cleaned up*/ 778711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr || m_inp_heap_ptr) { 778811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Freeing the Input Memory"); 778911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) { 779011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 779111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_inp_bm_count, i)) { 779211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_inp_bm_count, i); 779311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr) 779411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer (i,&m_inp_mem_ptr[i]); 779511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 779611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer (i,NULL); 779711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 779811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 779911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_input_done()) { 780011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 780111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 780211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 780311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 780411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer_header(); 780511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_output_buffer_header(); 780611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.pBuffer) { 780711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(h264_scratch.pBuffer); 780811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer = NULL; 780911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 781011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 781111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_parser) { 781211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel delete h264_parser; 781311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser = NULL; 781411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 781511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 781611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils) { 781711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free utils parser"); 781811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel delete (m_frame_parser.mutils); 781911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils = NULL; 782011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 782111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 782211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_platform_list) { 782311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_platform_list); 782411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list = NULL; 782511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 782611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_vendor_config.pData) { 782711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_vendor_config.pData); 782811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_vendor_config.pData = NULL; 782911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 783011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 783111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Reset counters in mesg queues 783211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.m_size=0; 783311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cmd_q.m_size=0; 783411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.m_size=0; 783511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.m_read = m_ftb_q.m_write =0; 783611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cmd_q.m_read = m_cmd_q.m_write =0; 783711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.m_read = m_etb_q.m_write =0; 783811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 783911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_timestamp) { 784011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.reset_ts_list(); 784111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 784211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 784311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 784411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG"); 784511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG, 784611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // NULL); 784711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Close the driver instance"); 784811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 784911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.infile) { 785011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(m_debug.infile); 785111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.infile = NULL; 785211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 785311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.outfile) { 785411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(m_debug.outfile); 785511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.outfile = NULL; 785611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 785711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.out_ymeta_file) { 785811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(m_debug.out_ymeta_file); 785911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_ymeta_file = NULL; 786011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 786111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.out_uvmeta_file) { 786211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(m_debug.out_uvmeta_file); 786311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_uvmeta_file = NULL; 786411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 786511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG 786611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (outputExtradataFile) 786711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose (outputExtradataFile); 786811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 786911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("omx_vdec::component_deinit() complete"); 787011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 787111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 787211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 787311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 787411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 787511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::UseEGLImage 787611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 787711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 787811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Use EGL Image method implementation <TBD>. 787911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 788011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 788111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 788211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 788311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 788411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Not Implemented error. 788511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 788611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 788711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp, 788811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 788911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 789011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 789111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN void* eglImage) 789211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 789311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) appData; 789411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list; 789511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry; 789611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info; 789711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 789811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU 789911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc; 790011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel EGLint fd = -1, offset = 0,pmemPtr = 0; 790111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 790211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fd = -1, offset = 0; 790311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 790411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("use EGL image support for decoder"); 790511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) { 790611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid EGL image"); 790711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 790811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU 790911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_display_id == NULL) { 791011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Display ID is not set by IL client"); 791111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 791211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 791311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC) 791411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eglGetProcAddress("eglQueryImageKHR"); 791511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE, &fd); 791611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET, &offset); 791711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR, &pmemPtr); 791811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else //with OMX test app 791911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct temp_egl { 792011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pmem_fd; 792111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int offset; 792211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel }; 792311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct temp_egl *temp_egl_id = NULL; 792411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel void * pmemPtr = (void *) eglImage; 792511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp_egl_id = (struct temp_egl *)eglImage; 792611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (temp_egl_id != NULL) { 792711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = temp_egl_id->pmem_fd; 792811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel offset = temp_egl_id->offset; 792911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 793011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 793111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 793211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd); 793311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 793411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 793511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_info.pmem_fd = (OMX_U32) fd; 793611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_info.offset = (OMX_U32) offset; 793711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_entry.entry = (void *) &pmem_info; 793811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 793911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list.entryList = &pmem_entry; 794011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list.nEntries = 1; 794111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ouput_egl_buffers = true; 794211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port, 794311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void *)&pmem_list, drv_ctx.op_buf.buffer_size, 794411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_U8 *)pmemPtr)) { 794511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("use buffer call failed for egl image"); 794611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 794711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 794811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 794911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 795011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 795111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 795211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 795311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ComponentRoleEnum 795411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 795511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 795611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Component Role Enum method implementation. 795711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 795811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 795911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 796011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 796111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 796211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything is successful. 796311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 796411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, 796511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_U8* role, 796611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 index) 796711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 796811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 796911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 797011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 797111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 797211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 797311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 797411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 797511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 797611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 797711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 797811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 797911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) { 798011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 798111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE); 798211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 798311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 798411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 798511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 798611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 798711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 798811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 798911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 799011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 799111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 799211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 799311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 799411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 799511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 799611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || 799711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))) { 799811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 799911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); 800011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 800111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 800211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 800311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 800411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 800511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 800611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 800711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 800811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 800911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 801011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 801111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 801211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 801311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) { 801411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 801511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE); 801611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 801711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 801811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 801911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 802011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 802111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 802211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 802311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE); 802411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s", role); 802511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 802611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 802711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 802811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 802911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) || 803011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE)) 803111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) { 803211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 803311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.vc1",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 } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 804011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 804111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE); 804211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 804311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 804411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 804511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 804611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 804711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) { 804811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 804911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE); 805011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 805111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 805211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("No more roles"); 805311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 805411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 805511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 805611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component"); 805711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidComponentName; 805811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 805911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 806011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 806111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 806211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 806311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 806411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 806511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 806611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 806711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::AllocateDone 806811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 806911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 807011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if entire buffer pool is allocated by IL Client or not. 807111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Need this to move to IDLE state. 807211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 807311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 807411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 807511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 807611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 807711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false. 807811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 807911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 808011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_done(void) 808111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 808211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 808311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet_In = false; 808411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet_Out = false; 808511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 808611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet_In = allocate_input_done(); 808711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet_Out = allocate_output_done(); 808811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 808911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bRet_In && bRet_Out) { 809011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 809111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 809211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 809311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 809411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 809511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 809611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 809711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::AllocateInputDone 809811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 809911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 810011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if I/P buffer pool is allocated by IL Client or not. 810111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 810211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 810311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 810411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 810511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 810611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false. 810711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 810811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 810911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_input_done(void) 811011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 811111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 811211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i=0; 811311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 811411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr == NULL) { 811511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 811611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 811711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr ) { 811811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; i<drv_ctx.ip_buf.actualcount; i++) { 811911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 812011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 812111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 812211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 812311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 812411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i == drv_ctx.ip_buf.actualcount) { 812511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 812611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Allocate done for all i/p buffers"); 812711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 812811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) { 812911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bPopulated = OMX_TRUE; 813011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 813111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 813211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 813311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 813411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 813511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::AllocateOutputDone 813611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 813711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 813811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if entire O/P buffer pool is allocated by IL Client or not. 813911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 814011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 814111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 814211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 814311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 814411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false. 814511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 814611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 814711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_output_done(void) 814811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 814911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 815011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned j=0; 815111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 815211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr == NULL) { 815311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 815411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 815511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 815611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 815711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; j < drv_ctx.op_buf.actualcount; j++) { 815811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_out_bm_count,j)) { 815911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 816011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 816111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 816211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 816311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 816411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (j == drv_ctx.op_buf.actualcount) { 816511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 816611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Allocate done for all o/p buffers"); 816711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_bEnabled) 816811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bPopulated = OMX_TRUE; 816911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 817011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 817111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 817211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 817311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 817411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 817511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 817611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ReleaseDone 817711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 817811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 817911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if IL client has released all the buffers. 818011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 818111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 818211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 818311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 818411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 818511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 818611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 818711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 818811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_done(void) 818911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 819011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 819111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 819211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_input_done()) { 819311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_output_done()) { 819411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 819511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 819611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 819711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 819811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 819911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 820011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 820111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 820211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 820311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ReleaseOutputDone 820411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 820511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 820611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if IL client has released all the buffers. 820711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 820811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 820911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 821011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 821111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 821211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 821311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 821411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 821511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_output_done(void) 821611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 821711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 821811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i=0,j=0; 821911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 822011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p", m_out_mem_ptr); 822111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 822211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; j < drv_ctx.op_buf.actualcount ; j++) { 822311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_out_bm_count,j)) { 822411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 822511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 822611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 822711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (j == drv_ctx.op_buf.actualcount) { 822811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count = 0; 822911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 823011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 823111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 823211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count = 0; 823311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 823411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 823511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 823611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 823711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 823811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 823911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec::ReleaseInputDone 824011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 824111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 824211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if IL client has released all the buffers. 824311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 824411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 824511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 824611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 824711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 824811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 824911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 825011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 825111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_input_done(void) 825211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 825311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 825411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i=0,j=0; 825511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 825611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr); 825711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr) { 825811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; j<drv_ctx.ip_buf.actualcount; j++) { 825911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( BITMASK_PRESENT(&m_inp_bm_count,j)) { 826011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 826111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 826211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 826311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (j==drv_ctx.ip_buf.actualcount) { 826411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 826511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 826611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 826711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 826811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 826911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 827011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 827111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 827211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp, 827311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE * buffer) 827411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 8275b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_HIGH("FBD"); 827611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL; 827711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!buffer || (buffer - m_out_mem_ptr) >= (int)drv_ctx.op_buf.actualcount) { 827811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer); 827911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 828011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (output_flush_progress) { 828111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer); 828211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 828311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nTimeStamp = 0; 828411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 828511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 828611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 828711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 828811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 828911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_extradata) { 829011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { 829111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("***************************************************"); 829211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received"); 829311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("***************************************************"); 829411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 829511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 829611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) { 829711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("***************************************************"); 829811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received"); 829911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("***************************************************"); 830011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 830111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 830211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 830311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 830411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, flags: 0x%x, timestamp: %lld", 830511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer, buffer->pBuffer, buffer->nFlags, buffer->nTimeStamp); 830611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers --; 8307b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers); 830811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 830911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 831011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Output EOS has been reached"); 831111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!output_flush_progress) 831211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event((unsigned)NULL, (unsigned)NULL, 831311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EOS_DONE); 831411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 831511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame) { 831611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame); 831711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 831811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 831911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) { 832011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 832111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.insert_entry((unsigned long) pdest_frame,(unsigned)NULL, 832211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL); 832311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 832411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 832511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 832611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 832711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG 832811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (outputExtradataFile) { 832911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int buf_index = buffer - m_out_mem_ptr; 833011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr); 833111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 833211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OTHER_EXTRADATATYPE *p_extra = NULL; 833311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) 833411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((unsigned long)(pBuffer + buffer->nOffset + buffer->nFilledLen + 3)&(~3)); 833511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 833611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (p_extra && (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) ) { 833711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%x", 833811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nSize, p_extra->eType); 833911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite (p_extra,1,p_extra->nSize,outputExtradataFile); 834011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 834111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_extra->eType == OMX_ExtraDataNone) { 834211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 834311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 834411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize); 834511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 834611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 834711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 834811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 834911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* For use buffer we need to copy the data */ 835011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!output_flush_progress) { 835111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* This is the error check for non-recoverable errros */ 835211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool is_duplicate_ts_valid = true; 835311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool is_interlaced = (drv_ctx.interlace != VDEC_InterlaceFrameProgressive); 835411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 835511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_capability == V4L2_PIX_FMT_MPEG4 || 835611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability == V4L2_PIX_FMT_MPEG2 || 835711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability == V4L2_PIX_FMT_DIVX || 835811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability == V4L2_PIX_FMT_DIVX_311) 835911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_duplicate_ts_valid = false; 836011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 836111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((output_capability == V4L2_PIX_FMT_H264 || 836211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability == V4L2_PIX_FMT_H264_MVC) && 836311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_interlaced) { 836411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF) { 836511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_interlaced = false; 836611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 836711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 836811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 836911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFilledLen > 0) { 837011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_dts.get_next_timestamp(buffer, 837111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_interlaced && is_duplicate_ts_valid); 837211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_timestamp) { 837311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 837411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TICKS expected_ts = 0; 837511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.pop_min_ts(expected_ts); 837611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_interlaced && is_duplicate_ts_valid) { 837711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.pop_min_ts(expected_ts); 837811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 837911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list", 838011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nTimeStamp, expected_ts); 838111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 838211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nTimeStamp != expected_ts) { 838311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check"); 838411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 838511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 838611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 838711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 838811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 8389b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FBD-TS", buffer->nTimeStamp / 1000); 839011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 839111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_cb.FillBufferDone) { 839211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFilledLen > 0) { 839311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) 839411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel adjust_timestamp(buffer->nTimeStamp); 839511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 839611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel set_frame_rate(buffer->nTimeStamp); 839711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8398fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel proc_frms++; 839911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (perf_flag) { 8400fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (1 == proc_frms) { 840111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec_time.stop(); 840211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel latency = dec_time.processing_time_us() - latency; 840311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3); 840411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec_time.start(); 840511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fps_metrics.start(); 840611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 840711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 840811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U64 proc_time = 0; 840911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fps_metrics.stop(); 841011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel proc_time = fps_metrics.processing_time_us(); 841111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%u) proc_time(%.2f)S fps(%.2f)", 841211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)proc_frms, (float)proc_time / 1e6, 841311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (float)(1e6 * proc_frms) / proc_time); 841411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 841511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 841611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 841711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { 841811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = LLONG_MAX; 841911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = true; 8420fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel proc_frms = 0; 842111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 842211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 842311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 842411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((OMX_QCOM_PLATFORM_PRIVATE_LIST *) 842511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->pPlatformPrivate)->entryList->entry; 842611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %lu",pPMEMInfo->pmem_fd); 842711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *il_buffer; 842811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel il_buffer = client_buffers.get_il_buf_hdr(buffer); 842911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 current_framerate = (int)(drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator); 843011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 843111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (il_buffer && m_last_rendered_TS >= 0) { 843211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TICKS ts_delta = (OMX_TICKS)llabs(il_buffer->nTimeStamp - m_last_rendered_TS); 843311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 843411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Current frame can be send for rendering if 843511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (a) current FPS is <= 60 843611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (b) is the next frame after the frame with TS 0 843711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (c) is the first frame after seek 843811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (d) the delta TS b\w two consecutive frames is > 16 ms 843911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (e) its TS is equal to previous frame TS 844011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (f) if marked EOS 844111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 844211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(current_framerate <= 60 || m_last_rendered_TS == 0 || 844311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel il_buffer->nTimeStamp == 0 || ts_delta >= 16000 || 844411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts_delta == 0 || (il_buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 844511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_last_rendered_TS = il_buffer->nTimeStamp; 844611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 844711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //mark for droping 844811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 844911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 845011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 845111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" -- %s Frame -- info:: fps(%d) lastRenderTime(%lld) bufferTs(%lld) ts_delta(%lld)", 845211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen? "Rendering":"Dropping",current_framerate,m_last_rendered_TS, 845311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel il_buffer->nTimeStamp,ts_delta); 845411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 845511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //above code makes sure that delta b\w two consecutive frames is not 845611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //greater than 16ms, slow-mo feature, so cap fps to max 60 845711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (current_framerate > 60 ) { 845811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel current_framerate = 60; 845911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 846011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 846111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 846211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // add current framerate to gralloc meta data 8463fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (buffer->nFilledLen > 0 && m_drc_enable && m_enable_android_native_buffers && m_out_mem_ptr) { 8464fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel //If valid fps was received, directly send it to display for the 1st fbd. 8465fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel //Otherwise, calculate fps using fbd timestamps, 8466fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel // when received 2 fbds, send a coarse fps, 8467fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel // when received 30 fbds, update fps again as it should be 8468fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel // more accurate than the one when only 2 fbds received. 8469fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel //For other frames, set value 0 to inform that refresh rate has no update 8470fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel float refresh_rate = m_fps_prev; 8471fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (m_fps_received) { 8472fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (1 == proc_frms) { 8473fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel refresh_rate = m_fps_received / (float)(1<<16); 8474fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 8475fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } else { 8476fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (2 == proc_frms || 30 == proc_frms) { 8477fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel refresh_rate = drv_ctx.frame_rate.fps_numerator / (float) drv_ctx.frame_rate.fps_denominator; 8478fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 8479fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 8480fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (refresh_rate > 60) { 8481fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel refresh_rate = 60; 8482fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 8483fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("frc set refresh_rate %f, frame %d", refresh_rate, proc_frms); 848411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 buf_index = buffer - m_out_mem_ptr; 848511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 8486fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel UPDATE_REFRESH_RATE, (void*)&refresh_rate); 8487fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_fps_prev = refresh_rate; 848811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 848911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 849011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFilledLen && m_enable_android_native_buffers && m_out_mem_ptr) { 849111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 buf_index = buffer - m_out_mem_ptr; 849211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("stereo_output_mode = %d",stereo_output_mode); 849311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 849411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel S3D_FORMAT, (void*)&stereo_output_mode); 849511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 849611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 849711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (il_buffer) { 849811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel log_output_buffers(il_buffer); 849911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dynamic_buf_mode) { 850011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int nPortIndex = 0; 850111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); 850211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 850311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Since we're passing around handles, adjust nFilledLen and nAllocLen 850411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // to size of the handle. Do it _after_ log_output_buffers which 850511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // requires the respective sizes to be accurate. 850611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 850711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nAllocLen = sizeof(struct VideoDecoderOutputMetaData); 850811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = buffer->nFilledLen ? 850911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(struct VideoDecoderOutputMetaData) : 0; 851011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 851111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Clear graphic buffer handles in dynamic mode 851211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nPortIndex < drv_ctx.op_buf.actualcount && 851311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) { 851411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[nPortIndex].privatehandle = NULL; 851511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[nPortIndex].nativehandle = NULL; 851611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 851711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("[FBD]Invalid native_buffer index: %d", nPortIndex); 851811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 851911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 852011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 852111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone (hComp,m_app_data,il_buffer); 852211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 852311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr"); 852411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 852511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 852611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd); 852711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 852811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 852911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 853011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 853111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED 853211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_smoothstreaming_mode && m_out_mem_ptr) { 853311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 buf_index = buffer - m_out_mem_ptr; 853411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BufferDim_t dim; 853511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *private_handle = NULL; 853611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dim.sliceWidth = framesize.nWidth; 853711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dim.sliceHeight = framesize.nHeight; 853811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_index < drv_ctx.op_buf.actualcount && 853911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS && 854011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[buf_index].privatehandle) 854111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle = native_buffer[buf_index].privatehandle; 854211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (private_handle) { 854311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set metadata: update buf-geometry with stride %d slice %d", 854411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dim.sliceWidth, dim.sliceHeight); 854511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setMetaData(private_handle, UPDATE_BUFFER_GEOMETRY, (void*)&dim); 854611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 854711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 854811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 854911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 855011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 855111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 855211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 855311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp, 855411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* buffer) 855511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 8556b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_HIGH("EBD"); 855711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nBufferIndex = buffer - m_inp_mem_ptr; 855811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8559fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (buffer == NULL || (nBufferIndex >= (int)drv_ctx.ip_buf.actualcount)) { 856011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer); 856111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 856211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 856311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 856411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, bufhdr->nFlags = 0x%x", 856511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer, buffer->pBuffer, buffer->nFlags); 856611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers--; 8567b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 856811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 856911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 857011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame == NULL && input_flush_progress == false) { 857111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer); 857211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = buffer; 857311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 857411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nTimeStamp = LLONG_MAX; 857511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel push_input_buffer (hComp); 857611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 857711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer); 857811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 857911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_input_free_q.insert_entry((unsigned long)buffer, 858011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL, (unsigned)NULL)) { 858111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error"); 858211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 858311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 858411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_cb.EmptyBufferDone) { 858511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 858611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_use_buffer == true) { 858711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr]; 858811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 858911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 859011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Restore the FD that we over-wrote in ETB */ 859111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pass_buffer_fd) { 859211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->pBuffer = (OMX_U8*)(uintptr_t)drv_ctx.ptr_inputbuffer[nBufferIndex].pmem_fd; 859311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 859411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 859511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(hComp ,m_app_data, buffer); 859611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 859711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 859811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 859911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 860011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::async_message_process (void *context, void* message) 860111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 860211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdec* omx = NULL; 860311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_msginfo *vdec_msg = NULL; 860411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* omxhdr = NULL; 860511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer *v4l2_buf_ptr = NULL; 860611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane *plane = NULL; 860711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_output_frameinfo *output_respbuf = NULL; 860811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc=1; 860911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (context == NULL || message == NULL) { 861011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check"); 861111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 861211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 861311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg = (struct vdec_msginfo *)message; 861411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 861511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx = reinterpret_cast<omx_vdec*>(context); 861611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 861711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (vdec_msg->msgcode) { 861811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 861911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_EVT_HW_ERROR: 862011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 862111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 862211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 862311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 862411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_EVT_HW_OVERLOAD: 862511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 862611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD); 862711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 862811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 862911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_EVT_HW_UNSUPPORTED: 863011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 863111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING); 863211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 863311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 863411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_START_DONE: 863511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 863611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_START_DONE); 863711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 863811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 863911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_STOP_DONE: 864011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 864111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_STOP_DONE); 864211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 864311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 864411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_RESUME_DONE: 864511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 864611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_RESUME_DONE); 864711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 864811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 864911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_PAUSE_DONE: 865011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 865111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_PAUSE_DONE); 865211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 865311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 865411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_FLUSH_INPUT_DONE: 865511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 865611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH); 865711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 865811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE: 865911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 866011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH); 866111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 866211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_INPUT_FLUSHED: 866311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_INPUT_BUFFER_DONE: 866411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 866511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* omxhdr = (OMX_BUFFERHEADERTYPE* ) 866611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.input_frame_clientdata; */ 866711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 866811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata; 866911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->m_inp_mem_ptr == NULL || v4l2_buf_ptr == NULL || 867011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr->index >= omx->drv_ctx.ip_buf.actualcount) { 867111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr = NULL; 867211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->status_code = VDEC_S_EFATAL; 867311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 867411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 867511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 867611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr = omx->m_inp_mem_ptr + v4l2_buf_ptr->index; 867711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 867811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED) { 867911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Unsupported input"); 868011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdec_msg->status_code,\ 868111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 868211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 868311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) { 868411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 868511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR; 868611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 868711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 868811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 868911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Decrement codec_config buffer counter"); 869011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel android_atomic_dec(&omx->m_queued_codec_config_count); 869111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((android_atomic_add(0, &omx->m_queued_codec_config_count) == 0) && 869211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&omx->m_flags, OMX_COMPONENT_FLUSH_DEFERRED)) { 869311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("sem post for CODEC CONFIG buffer"); 869411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post(&omx->m_safe_flush); 869511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 869611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 869711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || 869811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) { 869911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME; 870011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 870111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned long)omxhdr,vdec_msg->status_code, 870211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 870311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 870411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_EVT_INFO_FIELD_DROPPED: 870511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int64_t *timestamp; 870611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel timestamp = (int64_t *) malloc(sizeof(int64_t)); 870711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (timestamp) { 870811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *timestamp = vdec_msg->msgdata.output_frame.time_stamp; 870911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned long)timestamp, vdec_msg->status_code, 871011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED); 871111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Field dropped time stamp is %lld", 871211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (long long)vdec_msg->msgdata.output_frame.time_stamp); 871311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 871411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 871511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_OUTPUT_FLUSHED: 871611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE: 871711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 871811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data; 871911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr == NULL || omx->m_out_mem_ptr == NULL || 872011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr->index >= omx->drv_ctx.op_buf.actualcount) { 872111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr = NULL; 872211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->status_code = VDEC_S_EFATAL; 872311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 872411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 872511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane = v4l2_buf_ptr->m.planes; 872611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr = omx->m_out_mem_ptr + v4l2_buf_ptr->index; 872711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 872811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr && omxhdr->pOutputPortPrivate && 872911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((omxhdr - omx->m_out_mem_ptr) < (int)omx->drv_ctx.op_buf.actualcount) && 873011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate 873111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel - omx->drv_ctx.ptr_respbuffer) < (int)omx->drv_ctx.op_buf.actualcount)) { 873211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 873311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (vdec_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) { 873411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len; 873511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset; 873611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp; 873711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags = 0; 873811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 873911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) { 874011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_EOS; 874111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //rc = -1; 874211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 874311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr->nFilledLen) { 874411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME; 874511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 874611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) { 874711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME; 874811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 874911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME; 875011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 875111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) { 875211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 875311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 875411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) { 875511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY; 875611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 875711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_MSM_BUF_FLAG_MBAFF) { 875811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_MBAFF; 875911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 876011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_READONLY) { 876111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_READONLY; 876211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("F_B_D: READONLY BUFFER - REFERENCE WITH F/W fd = %d", 876311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd); 876411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 876511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 876611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) && 876711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !omx->output_flush_progress && 876811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) && 876911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS)) { 877011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = v4l2_buf_ptr->index; 877111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int extra_idx = EXTRADATA_IDX(omx->drv_ctx.num_planes); 877211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->time_stamp_dts.remove_time_stamp( 877311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nTimeStamp, 877411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (omx->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) 877511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ?true:false); 877611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].bytesused = 0; 877711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = 877811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)omx->drv_ctx.ptr_outputbuffer[index].bufferaddr - 877911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)omx->drv_ctx.ptr_outputbuffer[index].offset; 878011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = omx->drv_ctx.ptr_outputbuffer[index].pmem_fd; 878111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[1] = omx->drv_ctx.ptr_outputbuffer[index].offset; 878211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = 0; 878311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr->flags = 0x0; 878411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 878511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].bytesused = 0; 878611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = omx->drv_ctx.extradata_info.buffer_size; 878711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = (long unsigned int) (omx->drv_ctx.extradata_info.uaddr + index * omx->drv_ctx.extradata_info.buffer_size); 878811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 878911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = omx->drv_ctx.extradata_info.ion.fd_ion_data.fd; 879011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 879111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[1] = v4l2_buf_ptr->index * omx->drv_ctx.extradata_info.buffer_size; 879211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].data_offset = 0; 879311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 879411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx); 879511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 879611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 879711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 879811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry 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", 879911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], omx->output_flush_progress); 880011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_QBUF, v4l2_buf_ptr)) { 880111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry 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]); 880211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 880311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 880411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 880511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 880611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) { 880711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 880811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 880911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 881011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf = (struct vdec_output_frameinfo *)\ 881111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->pOutputPortPrivate; 881211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!output_respbuf) { 881311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("async_message_process: invalid output buf received"); 881411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 881511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 881611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf->len = vdec_msg->msgdata.output_frame.len; 881711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf->offset = vdec_msg->msgdata.output_frame.offset; 881811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 881911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) { 882011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf->pic_type = PICTURE_TYPE_I; 882111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 882211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) { 882311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf->pic_type = PICTURE_TYPE_P; 882411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 882511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) { 882611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf->pic_type = PICTURE_TYPE_B; 882711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 882811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 882911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (vdec_msg->msgdata.output_frame.len) { 883042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel if (!omx->output_flush_progress && (omxhdr->nFilledLen > 0)) { 883142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // set the default colorspace advised by client, since the bitstream may be 883242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // devoid of colorspace-info. 883342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel if (omx->m_enable_android_native_buffers) { 883442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel ColorSpace_t color_space = ITU_R_601; 883542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel 883642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // Disabled ? 883742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // WA for VP8. Vp8 encoder does not embed color-info (yet!). 883842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // Encoding RGBA results in 601-LR for all resolutions. 883942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // This conflicts with the client't defaults which are based on resolution. 884042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // Eg: 720p will be encoded as 601-LR. Client will say 709. 884142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // Re-enable this code once vp8 encoder generates color-info and hence the 884242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel // decoder will be able to override with the correct source color. 884342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#if 0 884442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel switch (omx->m_client_color_space.sAspects.mPrimaries) { 884542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel case ColorAspects::PrimariesBT601_6_625: 884642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel case ColorAspects::PrimariesBT601_6_525: 884742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel { 884842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel color_space = omx->m_client_color_space.sAspects.mRange == ColorAspects::RangeFull ? 884942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel ITU_R_601_FR : ITU_R_601; 885042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel break; 885142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 885242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel case ColorAspects::PrimariesBT709_5: 885342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel { 885442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel color_space = ITU_R_709; 885542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel break; 885642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 885742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel default: 885842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel { 885942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel break; 886042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 886142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 886242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#endif 886342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel DEBUG_PRINT_LOW("setMetaData for Color Space (client) = 0x%x (601=%u FR=%u 709=%u)", 886442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel color_space, ITU_R_601, ITU_R_601_FR, ITU_R_709); 886542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel omx->set_colorspace_in_handle(color_space, omxhdr - omx->m_out_mem_ptr); 886642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 886742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 886842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel 886911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Processing extradata"); 887011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->handle_extradata(omxhdr); 887111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 887211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->m_extradata_info.output_crop_updated) { 887311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Read FBD crop from output extra data"); 887411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.left = omx->m_extradata_info.output_crop_rect.nLeft; 887511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.top = omx->m_extradata_info.output_crop_rect.nTop; 887611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.right = omx->m_extradata_info.output_crop_rect.nWidth; 887711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.bottom = omx->m_extradata_info.output_crop_rect.nHeight; 887811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_width = omx->m_extradata_info.output_width; 887911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_height = omx->m_extradata_info.output_height; 888011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 888111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Read FBD crop from v4l2 reserved fields"); 888211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.left = plane[0].reserved[2]; 888311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.top = plane[0].reserved[3]; 888411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.right = plane[0].reserved[2] + plane[0].reserved[4]; 888511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.bottom = plane[0].reserved[3] + plane[0].reserved[5]; 888611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_width = plane[0].reserved[6]; 888711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_height = plane[0].reserved[7]; 8888fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 8889fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel /* Copy these values back to OMX internal variables to make both handlign same*/ 8890fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 8891fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel omx->m_extradata_info.output_crop_rect.nLeft = vdec_msg->msgdata.output_frame.framesize.left; 8892fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel omx->m_extradata_info.output_crop_rect.nTop = vdec_msg->msgdata.output_frame.framesize.top; 8893fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel omx->m_extradata_info.output_crop_rect.nWidth = vdec_msg->msgdata.output_frame.framesize.right; 8894fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel omx->m_extradata_info.output_crop_rect.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom; 8895fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel omx->m_extradata_info.output_width = vdec_msg->msgdata.output_frame.picsize.frame_width; 8896fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel omx->m_extradata_info.output_height = vdec_msg->msgdata.output_frame.picsize.frame_height; 889711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 889811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 889911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 890011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.bufferaddr = 890111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr; 890211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8903fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (vdec_msg->msgdata.output_frame.len) 8904fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(&omx->drv_ctx.frame_size, 8905fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel &vdec_msg->msgdata.output_frame.framesize, 8906fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel sizeof(struct vdec_framesize)); 890711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8908fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("[RespBufDone] Fd(%d) Buf(%p) Ts(%lld) PicType(%u) Flags (0x%x)" 8909fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel " FillLen(%u) Crop: L(%u) T(%u) R(%u) B(%u)", 8910fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd, 891111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr, (long long)vdec_msg->msgdata.output_frame.time_stamp, 891211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.pic_type, v4l2_buf_ptr->flags, 891311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)vdec_msg->msgdata.output_frame.len, 891411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.left, 891511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.top, 891611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.right, 891711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.bottom); 891811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 891911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Post event if resolution OR crop changed */ 892011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* filled length will be changed if resolution changed */ 892111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Crop parameters can be changed even without resolution change */ 892211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr->nFilledLen 892311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && ((omx->prev_n_filled_len != omxhdr->nFilledLen) 892411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (omx->drv_ctx.frame_size.left != vdec_msg->msgdata.output_frame.framesize.left) 892511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (omx->drv_ctx.frame_size.top != vdec_msg->msgdata.output_frame.framesize.top) 892611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (omx->drv_ctx.frame_size.right != vdec_msg->msgdata.output_frame.framesize.right) 892711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (omx->drv_ctx.frame_size.bottom != vdec_msg->msgdata.output_frame.framesize.bottom) 892811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (omx->drv_ctx.video_resolution.frame_width != vdec_msg->msgdata.output_frame.picsize.frame_width) 892911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (omx->drv_ctx.video_resolution.frame_height != vdec_msg->msgdata.output_frame.picsize.frame_height) )) { 893011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 893111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry 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", 893211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->prev_n_filled_len, 893311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.frame_width, 893411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.frame_height, 893511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.frame_size.left, omx->drv_ctx.frame_size.top, 893611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.frame_size.right, omx->drv_ctx.frame_size.bottom, 893711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFilledLen, vdec_msg->msgdata.output_frame.picsize.frame_width, 893811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_height, 893911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.left, 894011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.top, 894111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.right, 894211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.framesize.bottom); 894311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 894411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.frame_width = 894511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_width; 894611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.frame_height = 894711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.picsize.frame_height; 894811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) { 894911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.stride = 895011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_Y_STRIDE(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_width); 895111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.scan_lines = 895211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_Y_SCANLINES(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_height); 895311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) { 895411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.stride = 895511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_width); 895611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.video_resolution.scan_lines = 895711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_height); 8958b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) { 8959b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel omx->drv_ctx.video_resolution.stride = 8960b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, omx->drv_ctx.video_resolution.frame_width); 8961b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel omx->drv_ctx.video_resolution.scan_lines = 8962b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, omx->drv_ctx.video_resolution.frame_height); 8963b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 896411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 896511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event(OMX_CORE_OUTPUT_PORT_INDEX, 896611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IndexConfigCommonOutputCrop, 896711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_PORT_RECONFIG); 896811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 896911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 897011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr->nFilledLen) 897111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->prev_n_filled_len = omxhdr->nFilledLen; 897211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 897311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr && omxhdr->nFilledLen && !omx->high_fps) { 897411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->request_perf_level(VIDC_NOMINAL); 897511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 897611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->output_use_buffer && omxhdr->pBuffer && 897711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.bufferaddr) 897811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy ( omxhdr->pBuffer, (void *) 897911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr + 898011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)vdec_msg->msgdata.output_frame.offset), 898111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdec_msg->msgdata.output_frame.len); 898211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 898311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid filled length = %u, buffer size = %u, prev_length = %u", 898411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)vdec_msg->msgdata.output_frame.len, 898511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nAllocLen, omx->prev_n_filled_len); 898611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFilledLen = 0; 898711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 898811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 898911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned long)omxhdr, vdec_msg->status_code, 899011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_FBD); 899111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 899211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) { 899311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned long)NULL, vdec_msg->status_code, 899411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EOS_DONE); 899511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 899611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned int)NULL, vdec_msg->status_code, 899711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 899811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 899911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 900011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_MSG_EVT_CONFIG_CHANGED: 900111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Port settings changed"); 900211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->m_reconfig_width = vdec_msg->msgdata.output_frame.picsize.frame_width; 900311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->m_reconfig_height = vdec_msg->msgdata.output_frame.picsize.frame_height; 900411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition, 900511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_PORT_RECONFIG); 900611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx->high_fps) { 900711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->request_perf_level(VIDC_NOMINAL); 900811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 900911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 901011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 901111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 901211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 901311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 901411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 901511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 901611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary ( 901711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_HANDLETYPE hComp, 901811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *buffer 901911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 902011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 902111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned address,p2,id; 902211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Empty this arbitrary"); 902311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 902411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL) { 902511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 902611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 902711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 902811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %u, timestamp %lld", 902911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)buffer->nFilledLen, (unsigned int)buffer->nFlags, buffer->nTimeStamp); 903011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 903111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* return zero length and not an EOS buffer */ 903211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* return buffer if input flush in progress */ 903311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) && 903411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) { 903511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress"); 903611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone (hComp,m_app_data,buffer); 903711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 903811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 903911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 904011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame == NULL) { 904111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp); 904211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = buffer; 904311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Try to Push One Input Buffer "); 904411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel push_input_buffer (hComp); 904511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 904611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer); 904711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_input_pending_q.insert_entry((unsigned long)buffer, (unsigned)NULL, 904811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL)) { 904911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 905011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 905111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 905211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 905311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { 905411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_config_flag = false; 905511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 905611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 905711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 905811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 905911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp) 906011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 906111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address,p2,id; 906211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 906311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 906411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame == NULL || psource_frame == NULL) { 906511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if we have a destination buffer*/ 906611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame == NULL) { 906711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Get a Destination buffer from the queue"); 906811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_free_q.m_size) { 906911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.pop_entry(&address,&p2,&id); 907011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = (OMX_BUFFERHEADERTYPE *)address; 907111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 907211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = LLONG_MAX; 907311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame); 907411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 907511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 907611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 907711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if we have a destination buffer*/ 907811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame == NULL) { 907911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Get a source buffer from the queue"); 908011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pending_q.m_size) { 908111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pending_q.pop_entry(&address,&p2,&id); 908211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = (OMX_BUFFERHEADERTYPE *)address; 908311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame, 908411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame->nTimeStamp); 908511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Next source Buffer flag %u length %u", 908611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen); 908711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 908811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 908911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 909011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 909111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 909211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 909311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while ((pdest_frame != NULL) && (psource_frame != NULL)) { 909411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (codec_type_parse) { 909511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case CODEC_TYPE_MPEG4: 909611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case CODEC_TYPE_H263: 909711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case CODEC_TYPE_MPEG2: 909811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = push_input_sc_codec(hComp); 909911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 910011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case CODEC_TYPE_H264: 910111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = push_input_h264(hComp); 910211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 910311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case CODEC_TYPE_HEVC: 910411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = push_input_hevc(hComp); 910511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 910611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case CODEC_TYPE_VC1: 910711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = push_input_vc1(hComp); 910811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 910911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 911011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 911111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 911211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret != OMX_ErrorNone) { 911311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Pushing input Buffer Failed"); 911411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 911511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 911611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 911711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 911811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 911911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 912011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 912111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 912211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp) 912311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 912411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 partial_frame = 1; 912511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL generate_ebd = OMX_TRUE; 912611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address = 0, p2 = 0, id = 0; 912711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 912811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %lld", 912911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame,psource_frame->nTimeStamp); 913011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.parse_sc_frame(psource_frame, 913111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame,&partial_frame) == -1) { 913211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 913311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 913411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 913511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 913611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (partial_frame == 0) { 913711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Frame size %u source %p frame count %d", 913811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen,psource_frame,frame_count); 913911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 914011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 914111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("TimeStamp updated %lld", pdest_frame->nTimeStamp); 914211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*First Parsed buffer will have only header Hence skip*/ 914311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frame_count == 0) { 914411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame "); 914511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 914611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_type_parse == CODEC_TYPE_MPEG4 || 914711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_type_parse == CODEC_TYPE_DIVX) { 914811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mp4StreamType psBits; 914911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset; 915011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psBits.numBytes = pdest_frame->nFilledLen; 915111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mp4_headerparser.parseHeader(&psBits); 915211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 915311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 915411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count++; 915511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 915611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 915711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame->nFilledLen) { 915811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Push the frame to the Decoder*/ 915911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 916011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 916111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 916211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count++; 916311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 916411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 916511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_free_q.m_size) { 916611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.pop_entry(&address,&p2,&id); 916711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 916811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 916911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 917011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) { 917111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Zero len buffer return back to POOL"); 917211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned)NULL, 917311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL); 917411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 917511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 917611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 917711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 917811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Not a Complete Frame %u", (unsigned int)pdest_frame->nFilledLen); 917911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if Destination Buffer is full*/ 918011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame->nAllocLen == 918111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen + pdest_frame->nOffset) { 918211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled"); 918311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorStreamCorrupt; 918411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 918511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 918611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 918711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFilledLen == 0) { 918811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 918911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) { 919011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags |= psource_frame->nFlags; 9191fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pdest_frame->nTimeStamp = psource_frame->nTimeStamp; 919211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %lld", 919311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 919411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Found a frame size = %u number = %d", 919511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen,frame_count++); 919611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Push the frame to the Decoder*/ 919711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 919811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 919911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 920011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count++; 920111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 920211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 920311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Last frame in else dest addr") ; 920411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel generate_ebd = OMX_FALSE; 920511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 920611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 920711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (generate_ebd) { 920811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame); 920911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 921011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 921111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 921211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pending_q.m_size) { 921311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame); 921411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pending_q.pop_entry(&address,&p2,&id); 921511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = (OMX_BUFFERHEADERTYPE *) address; 921611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame, 921711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame->nTimeStamp); 921811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Next source Buffer flag %u length %u", 921911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen); 922011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 922111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 922211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 922311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 922411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 922511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 922611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp) 922711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 922811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 partial_frame = 1; 922911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address = 0, p2 = 0, id = 0; 923011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL isNewFrame = OMX_FALSE; 923111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL generate_ebd = OMX_TRUE; 923211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 923311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.pBuffer == NULL) { 923411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated"); 923511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 923611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 923711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %u " 923811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "look_ahead_nal %d", (unsigned int)h264_scratch.nFilledLen, look_ahead_nal); 923911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %u",(unsigned int)pdest_frame->nFilledLen); 924011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.nFilledLen && look_ahead_nal) { 924111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = false; 924211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 924311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen) { 924411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 924511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer,h264_scratch.nFilledLen); 924611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen += h264_scratch.nFilledLen; 924711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame"); 924811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 924911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 925011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264"); 925111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 925211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 925311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 925411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 925511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* If an empty input is queued with EOS, do not coalesce with the destination-frame yet, as this may result 925611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel in EOS flag getting associated with the destination 925711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 925811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame->nFilledLen && (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) && 925911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen) { 926011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("delay ETB for 'empty buffer with EOS'"); 926111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel generate_ebd = OMX_FALSE; 926211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 926311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 926411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nal_length == 0) { 926511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Zero NAL, hence parse using start code"); 926611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.parse_sc_frame(psource_frame, 926711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &h264_scratch,&partial_frame) == -1) { 926811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 926911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 927011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 927111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 927211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length); 927311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.parse_h264_nallength(psource_frame, 927411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &h264_scratch,&partial_frame) == -1) { 927511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error"); 927611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 927711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 927811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 927911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 928011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (partial_frame == 0) { 928111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 928211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip"); 928311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count++; 928411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 928511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFlags = psource_frame->nFlags; 928611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 928711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Parsed New NAL Length = %u",(unsigned int)h264_scratch.nFilledLen); 928811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.nFilledLen) { 928911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen, 929011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NALU_TYPE_SPS); 929111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 929211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_TIMEINFO_EXTRADATA) 929311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 929411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen, NALU_TYPE_SEI); 929511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 929611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // If timeinfo is present frame info from SEI is already processed 929711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, 929811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen, NALU_TYPE_SEI); 929911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 930011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame); 930111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count++; 930211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) { 930311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = h264_last_au_ts; 930411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = h264_last_au_flags; 930511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef PANSCAN_HDLR 930611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 930711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_parser->update_panscan_data(h264_last_au_ts); 930811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 930911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 931011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR || 931111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) { 931211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts = h264_scratch.nTimeStamp; 931311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_flags = h264_scratch.nFlags; 931411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 931511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 931611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts); 931711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!VALID_TS(h264_last_au_ts)) 931811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts = ts_in_sei; 931911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 932011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 932111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 932211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts = LLONG_MAX; 932311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 932411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 932511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!isNewFrame) { 932611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 932711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen) { 932811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %u", 932911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)h264_scratch.nFilledLen); 933011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 933111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer,h264_scratch.nFilledLen); 933211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen += h264_scratch.nFilledLen; 933311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ) 933411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ; 933511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 933611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 933711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264"); 933811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 933911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 934011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(h264_scratch.nFilledLen) { 934111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = true; 934211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %llu", 934311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 934411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Found a frame size = %u number = %d", 934511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen,frame_count++); 934611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 934711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame->nFilledLen == 0) { 934811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Copy the Current Frame since and push it"); 934911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = false; 935011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 935111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen) { 935211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 935311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer,h264_scratch.nFilledLen); 935411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen += h264_scratch.nFilledLen; 935511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 935611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 935711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264"); 935811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 935911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 936011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 936111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 936211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Reset the EOS Flag"); 936311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 936411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 936511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Push the frame to the Decoder*/ 936611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 936711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 936811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 936911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //frame_count++; 937011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 937111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_free_q.m_size) { 937211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.pop_entry(&address,&p2,&id); 937311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 937411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame); 937511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 937611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = 0; 937711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = LLONG_MAX; 937811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 937911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 938011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 938111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 938211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 938311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %u", (unsigned int)pdest_frame->nFilledLen); 938411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if Destination Buffer is full*/ 938511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.nAllocLen == 938611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen + h264_scratch.nOffset) { 938711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled"); 938811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorStreamCorrupt; 938911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 939011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 939111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 939211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame->nFilledLen) { 939311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame); 939411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 939511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 939611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) { 939711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer"); 939811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >= 939911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen) { 940011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(pdest_frame->nFilledLen == 0) { 940111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* No residual frame from before, send whatever 940211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * we have left */ 940311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy((pdest_frame->pBuffer + pdest_frame->nFilledLen), 940411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer, h264_scratch.nFilledLen); 940511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen += h264_scratch.nFilledLen; 940611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 940711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 940811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 940911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame); 941011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!isNewFrame) { 941111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Have a residual frame, but we know that the 941211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * AU in this frame is belonging to whatever 941311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * frame we had left over. So append it */ 941411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen), 941511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.pBuffer,h264_scratch.nFilledLen); 941611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen += h264_scratch.nFilledLen; 941711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen = 0; 941811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_last_au_ts != LLONG_MAX) 941911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = h264_last_au_ts; 942011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 942111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Completely new frame, let's just push what 942211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * we have now. The resulting EBD would trigger 942311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * another push */ 942411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel generate_ebd = OMX_FALSE; 942511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = h264_last_au_ts; 942611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_last_au_ts = h264_scratch.nTimeStamp; 942711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 942811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 942911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 943011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264"); 943111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 943211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 943311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 943411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Iff we coalesced two buffers, inherit the flags of both bufs */ 943511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(generate_ebd == OMX_TRUE) { 943611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 943711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 943811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 943911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%u TimeStamp = %llu", 944011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp); 944111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++); 944211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT 944311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_TIMEINFO_EXTRADATA) { 944411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp); 944511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!VALID_TS(pdest_frame->nTimeStamp)) 944611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = ts_in_sei; 944711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 944811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 944911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Push the frame to the Decoder*/ 945011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) { 945111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 945211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 945311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count++; 945411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 945511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 945611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u", 945711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame, (unsigned int)h264_scratch.nFilledLen); 945811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel generate_ebd = OMX_FALSE; 945911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 946011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 946111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 946211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (generate_ebd && !psource_frame->nFilledLen) { 946311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame); 946411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 946511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pending_q.m_size) { 946611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame); 946711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pending_q.pop_entry(&address,&p2,&id); 946811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = (OMX_BUFFERHEADERTYPE *) address; 946911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Next source Buffer flag %u src length %u", 947011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen); 947111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 947211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 947311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 947411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 947511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 947611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc) 947711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 947811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE rc = OMX_ErrorNone; 947911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) { 948011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen); 948111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pDst->nTimeStamp == LLONG_MAX) { 948211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pDst->nTimeStamp = pSrc->nTimeStamp; 948311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Assign Dst nTimeStamp = %lld", pDst->nTimeStamp); 948411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 948511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pDst->nFilledLen += pSrc->nFilledLen; 948611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pSrc->nFilledLen = 0; 948711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 948811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Destination buffer overflow"); 948911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = OMX_ErrorBadParameter; 949011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 949111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 949211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 949311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 949411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_hevc(OMX_HANDLETYPE hComp) 949511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 949611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 partial_frame = 1; 949711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address,p2,id; 949811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL isNewFrame = OMX_FALSE; 949911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL generate_ebd = OMX_TRUE; 950011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE rc = OMX_ErrorNone; 950111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.pBuffer == NULL) { 950211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated"); 950311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 950411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 950511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 950611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("h264_scratch.nFilledLen %u has look_ahead_nal %d \ 950711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame nFilledLen %u nTimeStamp %lld", 950811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)h264_scratch.nFilledLen, look_ahead_nal, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 950911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 951011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.nFilledLen && look_ahead_nal) { 951111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = false; 951211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = copy_buffer(pdest_frame, &h264_scratch); 951311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc != OMX_ErrorNone) { 951411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 951511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 951611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 951711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 951811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nal_length == 0) { 951911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.parse_sc_frame(psource_frame, 952011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &h264_scratch,&partial_frame) == -1) { 952111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error In Parsing Return Error"); 952211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 952311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 952411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 952511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length); 952611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_frame_parser.parse_h264_nallength(psource_frame, 952711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &h264_scratch,&partial_frame) == -1) { 952811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error"); 952911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 953011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 953111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 953211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 953311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (partial_frame == 0) { 953411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nal_count == 0 && h264_scratch.nFilledLen == 0) { 953511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip"); 953611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count++; 953711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nTimeStamp = psource_frame->nTimeStamp; 953811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFlags = psource_frame->nFlags; 953911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 954011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Parsed New NAL Length = %u", (unsigned int)h264_scratch.nFilledLen); 954111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.nFilledLen) { 954211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_hevc_utils.isNewFrame(&h264_scratch, 0, isNewFrame); 954311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_count++; 954411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 954511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 954611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!isNewFrame) { 954711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %u \ 954811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nTimestamp %lld, pdest_frame nFilledLen %u nTimestamp %lld", 954911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp, 955011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 955111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = copy_buffer(pdest_frame, &h264_scratch); 955211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc != OMX_ErrorNone) { 955311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 955411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 955511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 955611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = true; 955711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame->nFilledLen == 0) { 955811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel look_ahead_nal = false; 955911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer"); 956011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = copy_buffer(pdest_frame, &h264_scratch); 956111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc != OMX_ErrorNone) { 956211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 956311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 956411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 956511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFilledLen || h264_scratch.nFilledLen) { 956611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS; 956711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 956811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FrameDetected # %d pdest_frame nFilledLen %u \ 956911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nTimeStamp %lld, look_ahead_nal in h264_scratch \ 957011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nFilledLen %u nTimeStamp %lld", 957111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count++, (unsigned int)pdest_frame->nFilledLen, 957211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp, (unsigned int)h264_scratch.nFilledLen, 957311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nTimeStamp); 957411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) { 957511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 957611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 957711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 957811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_free_q.m_size) { 957911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.pop_entry(&address, &p2, &id); 958011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = (OMX_BUFFERHEADERTYPE *) address; 958111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("pop the next pdest_buffer %p", pdest_frame); 958211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 958311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = 0; 958411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = LLONG_MAX; 958511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 958611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 958711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 958811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 958911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 959011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %u nTimeStamp %lld, \ 959111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame nFilledLen %u nTimeStamp %lld, h264_scratch \ 959211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nFilledLen %u nTimeStamp %lld", 959311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp, 959411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp, 959511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp); 959611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 959711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264_scratch.nAllocLen == 959811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264_scratch.nFilledLen + h264_scratch.nOffset) { 959911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled"); 960011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorStreamCorrupt; 960111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 960211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 960311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 960411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame->nFilledLen) { 960511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client", psource_frame); 960611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 960711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) { 960811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer"); 960911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = copy_buffer(pdest_frame, &h264_scratch); 961011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( rc != OMX_ErrorNone ) { 961111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 961211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 961311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = h264_scratch.nTimeStamp; 961411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags; 961511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%u TimeStamp = %lld", 961611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp); 961711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) { 961811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 961911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 962011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_count++; 962111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 962211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 962311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u", 962411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame, (unsigned int)h264_scratch.nFilledLen); 962511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel generate_ebd = OMX_FALSE; 962611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 962711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 962811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 962911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 963011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (generate_ebd && !psource_frame->nFilledLen) { 963111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone (hComp, m_app_data, psource_frame); 963211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 963311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_input_pending_q.m_size) { 963411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pending_q.pop_entry(&address, &p2, &id); 963511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = (OMX_BUFFERHEADERTYPE *)address; 963611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Next source Buffer flag %u nFilledLen %u, nTimeStamp %lld", 963711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp); 963811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 963911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 964011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 964111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 964211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 964311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_vc1(OMX_HANDLETYPE hComp) 964411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 964511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *buf, *pdest; 964611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 partial_frame = 1; 964711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 buf_len, dest_len; 964811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 964911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (first_frame == 0) { 965011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel first_frame = 1; 965111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes"); 965211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_vendor_config.pData) { 965311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Check profile type in 1st source buffer"); 965411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf = psource_frame->pBuffer; 965511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_len = psource_frame->nFilledLen; 965611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 965711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) == 965811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VC1_SP_MP_START_CODE) { 965911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_vc1_profile = VC1_SP_MP_RCV; 966011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) { 966111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_vc1_profile = VC1_AP; 966211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 966311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer"); 966411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorStreamCorrupt; 966511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 966611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 966711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen + 966811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nOffset; 966911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen + 967011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nOffset); 967111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 967211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dest_len < m_vendor_config.nDataSize) { 967311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Destination buffer full"); 967411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 967511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 967611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize); 967711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen += m_vendor_config.nDataSize; 967811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 967911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 968011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 968111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 968211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (m_vc1_profile) { 968311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VC1_AP: 968411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code"); 968511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (push_input_sc_codec(hComp) != OMX_ErrorNone) { 968611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code"); 968711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 968811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 968911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 969011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 969111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VC1_SP_MP_RCV: 969211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 969311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode"); 969411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 969511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 969611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 969711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 969811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 969911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef USE_ION 970011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 970111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 alignment) 970211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 970311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem_allocation allocation; 970411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocation.size = buffer_size; 970511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocation.align = clip2(alignment); 970611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocation.align < 4096) { 970711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocation.align = 4096; 970811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 970911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) { 971011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)", 971111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocation.align, allocation.size); 971211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 971311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 971411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 971511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 971611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 971711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 971811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size, 971911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 alignment, struct ion_allocation_data *alloc_data, 972011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_fd_data *fd_data, int flag) 972111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 972211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fd = -EINVAL; 972311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = -EINVAL; 972411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ion_dev_flag; 972511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_ion ion_buf_info; 972611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!alloc_data || buffer_size <= 0 || !fd_data) { 972711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory"); 972811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -EINVAL; 972911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 973011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_dev_flag = O_RDONLY; 973111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = open (MEM_DEVICE, ion_dev_flag); 973211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 973311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd); 973411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return fd; 973511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 973611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 973711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->flags = flag; 973811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->len = buffer_size; 973911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->align = clip2(alignment); 974011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (alloc_data->align < 4096) { 974111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->align = 4096; 974211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 974311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 974411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID); 974511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode && (alloc_data->flags & ION_SECURE)) { 974611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID); 974711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 974811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 974911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Use secure display cma heap for obvious reasons. */ 975011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (alloc_data->flags & ION_FLAG_CP_BITSTREAM) { 975111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->heap_id_mask |= ION_HEAP(ION_SECURE_DISPLAY_HEAP_ID); 975211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 975311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 975411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd,ION_IOC_ALLOC,alloc_data); 975511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc || !alloc_data->handle) { 975611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION ALLOC memory failed"); 975711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->handle = 0; 975811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(fd); 975911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = -ENOMEM; 976011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return fd; 976111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 976211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd_data->handle = alloc_data->handle; 976311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd,ION_IOC_MAP,fd_data); 976411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 976511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION MAP failed "); 976611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_buf_info.ion_alloc_data = *alloc_data; 976711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_buf_info.ion_device_fd = fd; 976811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_buf_info.fd_ion_data = *fd_data; 976911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&ion_buf_info); 977011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd_data->fd =-1; 977111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = -ENOMEM; 977211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 977311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 977411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return fd; 977511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 977611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 977711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) 977811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 977911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 978011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!buf_ion_info) { 978111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata"); 978211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 978311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 978411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE, 978511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &buf_ion_info->ion_alloc_data.handle)) { 978611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION: free failed" ); 978711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 978811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(buf_ion_info->ion_device_fd); 978911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info->ion_device_fd = -1; 979011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info->ion_alloc_data.handle = 0; 979111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info->fd_ion_data.fd = -1; 979211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 979311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 979411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_output_buffer_header() 979511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 979611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ALL output buffers are freed/released"); 979711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_use_buffer = false; 979811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ouput_egl_buffers = false; 979911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 980011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 980111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_out_mem_ptr); 980211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = NULL; 980311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 980411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 980511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_platform_list) { 980611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_platform_list); 980711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list = NULL; 980811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 980911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 981011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_respbuffer) { 981111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (drv_ctx.ptr_respbuffer); 981211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = NULL; 981311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 981411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer) { 981511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (drv_ctx.ptr_outputbuffer); 981611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = NULL; 981711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 981811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 981911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.op_buf_ion_info) { 982011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free o/p ion context"); 982111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.op_buf_ion_info); 982211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = NULL; 982311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 982411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 982511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ref_remove(); 982611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 982711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 982811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_input_buffer_header() 982911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 983011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer = false; 983111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (arbitrary_bytes) { 983211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_heap_ptr) { 983311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free input Heap Pointer"); 983411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_inp_heap_ptr); 983511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr = NULL; 983611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 983711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 983811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_phdr_pmem_ptr) { 983911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free input pmem header Pointer"); 984011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_phdr_pmem_ptr); 984111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr = NULL; 984211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 984311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 984411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr) { 984511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free input pmem Pointer area"); 984611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_inp_mem_ptr); 984711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr = NULL; 984811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 984911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* We just freed all the buffer headers, every thing in m_input_free_q, 985011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * m_input_pending_q, pdest_frame, and psource_frame is now invalid */ 985111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_input_free_q.m_size) { 985211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address, p2, id; 985311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.pop_entry(&address, &p2, &id); 985411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 985511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_input_pending_q.m_size) { 985611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address, p2, id; 985711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_pending_q.pop_entry(&address, &p2, &id); 985811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 985911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 986011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 986111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_inputbuffer) { 986211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Driver Context pointer"); 986311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (drv_ctx.ptr_inputbuffer); 986411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer = NULL; 986511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 986611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 986711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ip_buf_ion_info) { 986811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free ion context"); 986911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ip_buf_ion_info); 987011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf_ion_info = NULL; 987111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 987211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 987311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 987411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 987511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::stream_off(OMX_U32 port) 987611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 987711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type btype; 987811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 987911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_ports v4l2_port = OUTPUT_PORT; 988011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 988111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX) { 988211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 988311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_port = OUTPUT_PORT; 988411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 988511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 988611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_port = CAPTURE_PORT; 988711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == OMX_ALL) { 988811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX); 988911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 989011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 989111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!rc_input) 989211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc_input; 989311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 989411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc_output; 989511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 989611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 989711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!streaming[v4l2_port]) { 989811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // already streamed off, warn and move on 989911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port," 990011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " which is already streamed off", v4l2_port); 990111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 990211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 990311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 990411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port); 990511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 990611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype); 990711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 990811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 990911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port); 991011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 991111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[v4l2_port] = false; 991211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 991311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 991411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 991511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 991611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 991711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop) 991811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 991911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 992011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 992111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int buf_size = 0, extra_data_size = 0, default_extra_data_size = 0; 992211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int final_extra_data_size = 0; 992311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 992411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret = 0; 992511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)", 992611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size); 992711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 992811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 1; 992911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 993011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 993111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 993211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 993311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 993411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 993511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 993611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 993711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 993811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 993911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 994011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet==OMX_ErrorNone) { 994111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 994211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 994311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 994411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 994511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 994611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 994711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 994811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 994911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool is_res_1080p_or_below = (drv_ctx.video_resolution.frame_width <= 1920 && 995011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height <= 1088) || 995111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.video_resolution.frame_height <= 1088 && 995211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width <= 1920); 995311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 995411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fps = drv_ctx.frame_rate.fps_numerator / (float)drv_ctx.frame_rate.fps_denominator; 995511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool fps_above_180 = (fps >= 180 || operating_frame_rate >= 180) ? true : false; 995611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool increase_output = (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) && (bufreq.count >= 16); 995711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 995811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (increase_output && fps_above_180 && 995911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability == V4L2_PIX_FMT_H264 && 996011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_res_1080p_or_below) { 996111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel high_fps = true; 996211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("High fps - fps = %d operating_rate = %d", fps, operating_frame_rate); 996311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("getbufreq[output]: Increase buffer count (%d) to (%d) to support high fps", 996411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count, bufreq.count + 10); 996511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count += 10; 996611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 996711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 996811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("(Failed to set updated buffer count to driver"); 996911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 997011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 997111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 997211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("new buf count = %d set to driver", bufreq.count); 997311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel request_perf_level(VIDC_TURBO); 997411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 997511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 997611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount = bufreq.count; 997711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->mincount = bufreq.count; 997811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Count = %d",bufreq.count); 997911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 998011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)", 998111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size); 998211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 998311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 998411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 998511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) 998611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes; 998711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Buffer Size = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage); 998811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 998911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 999011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 999111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Requesting buffer requirements failed"); 999211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 999311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 999411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 999511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 999611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = is_video_session_supported(); 999711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet) 999811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 999911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1000011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 1000111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = buffer_prop->buffer_size; 1000211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(drv_ctx.num_planes); 1000311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 1000411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage; 1000511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 1000611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 1000711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1000811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1000911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1001011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default_extra_data_size = VENUS_EXTRADATA_SIZE( 1001111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height, 1001211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width); 1001311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel final_extra_data_size = extra_data_size > default_extra_data_size ? 1001411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_data_size : default_extra_data_size; 1001511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1001611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel final_extra_data_size = (final_extra_data_size + buffer_prop->alignment - 1) & 1001711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (~(buffer_prop->alignment - 1)); 1001811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1001911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.size = buffer_prop->actualcount * final_extra_data_size; 1002011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.count = buffer_prop->actualcount; 1002111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.buffer_size = final_extra_data_size; 1002211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 1002311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%u) BufSize(%d)", 1002411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size, buf_size); 1002511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_data_size) 1002611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq UPDATE: extradata: TotalSize(%d) BufferSize(%lu)", 1002711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.size, drv_ctx.extradata_info.buffer_size); 1002811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1002911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (in_reconfig) // BufReq will be set to driver when port is disabled 1003011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size = buf_size; 1003111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (buf_size != buffer_prop->buffer_size) { 1003211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size = buf_size; 1003311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_buffer_req(buffer_prop); 1003411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1003511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1003611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%u)", 1003711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size); 1003811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1003911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1004011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1004111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop) 1004211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1004311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1004411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned buf_size = 0; 100452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel struct v4l2_format fmt, c_fmt; 1004611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 100472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel int ret = 0; 1004811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%u)", 1004911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size); 1005011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 1005111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_size != buffer_prop->buffer_size) { 1005211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%u) Required(%d)", 1005311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)buffer_prop->buffer_size, buf_size); 1005411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 1005511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1005611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 100572601808ee2992a94c325d05e4065aba60b01840bThierry Strudel memset(&c_fmt, 0x0, sizeof(struct v4l2_format)); 1005811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 1005911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 1006011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size; 1006111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1006211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 1006311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1006411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 100652601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 1006611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 100672601808ee2992a94c325d05e4065aba60b01840bThierry Strudel c_fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 100682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel c_fmt.fmt.pix_mp.pixelformat = capture_capability; 100692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &c_fmt); 100702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel c_fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size; 100712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &c_fmt); 1007211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1007311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 1007411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1007511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1007611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1007711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 1007811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret); 1007911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1008011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1008111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1008211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 1008311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = buffer_prop->actualcount; 1008411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) { 1008511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1008611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) { 1008711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1008811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1008911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 1009011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1009111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1009211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet==OMX_ErrorNone) { 1009311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq); 1009411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1009511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1009611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1009711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret); 1009811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: How to handle this case */ 1009911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1010011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (bufreq.count < buffer_prop->actualcount) { 1010111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Driver refused to change the number of buffers" 1010211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " on v4l2 port %d to %d (prefers %d)", bufreq.type, 1010311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, bufreq.count); 1010411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1010511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1010611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_buffers.update_buffer_req()) { 1010711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed"); 1010811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1010911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1011011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1011111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1011211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1011311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1011411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1011511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::update_picture_resolution() 1011611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1011711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1011811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1011911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1012011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1012111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn) 1012211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1012311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1012411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 1012511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!portDefn) { 1012611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1012711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1012811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdec::update_portdef"); 1012911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nVersion.nVersion = OMX_SPEC_VERSION; 1013011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 1013111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->eDomain = OMX_PortDomainVideo; 1013211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 1013311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == portDefn->nPortIndex) { 1013411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->eDir = OMX_DirInput; 1013511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount; 1013611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount; 1013711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size; 1013811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused; 1013911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.eCompressionFormat = eCompressionFormat; 10140fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel //for input port, always report the fps value set by client, 10141fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel //to distinguish whether client got valid fps from parser. 10142fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel portDefn->format.video.xFramerate = m_fps_received; 1014311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->bEnabled = m_inp_bEnabled; 1014411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->bPopulated = m_inp_bPopulated; 1014511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1014611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1014711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 101482601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 1014911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (1 == portDefn->nPortIndex) { 1015011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int buf_size = 0; 1015111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret = 0; 101522601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (!is_down_scalar_enabled) { 101532601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 101542601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 101552601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 101562601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 101572601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 101582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 101592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 1016011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1016111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 1016211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 1016311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1016411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Resolution failed"); 1016511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 1016611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1016711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 1016811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_buffers.update_buffer_req()) { 1016911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed"); 1017011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 1017111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1017211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1017311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_buffers.get_buffer_req(buf_size)) { 1017411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("update buffer requirements"); 1017511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 1017611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1017711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferSize = buf_size; 1017811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->eDir = OMX_DirOutput; 1017911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount; 1018011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountMin = drv_ctx.op_buf.mincount; 1018111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 10182fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (drv_ctx.frame_rate.fps_denominator > 0) 10183fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel portDefn->format.video.xFramerate = (drv_ctx.frame_rate.fps_numerator / 10184fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel drv_ctx.frame_rate.fps_denominator) << 16; //Q16 format 10185fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel else { 10186fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_ERROR("Error: Divide by zero"); 10187fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return OMX_ErrorBadParameter; 10188fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 1018911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->bEnabled = m_out_bEnabled; 1019011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->bPopulated = m_out_bPopulated; 1019111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) { 1019211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error in getting color format"); 1019311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 1019411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1019511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1019611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 1019711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1019811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->eDir = OMX_DirMax; 1019911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d", 1020011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->nPortIndex); 1020111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 1020211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 102032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, 102042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.plane_fmt[0].bytesperline, fmt.fmt.pix_mp.plane_fmt[0].reserved[0]); 102052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 1020611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameHeight = drv_ctx.video_resolution.frame_height; 1020711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth = drv_ctx.video_resolution.frame_width; 1020811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nStride = drv_ctx.video_resolution.stride; 1020911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines; 1021011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1021111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420Planar) || 1021211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)) { 1021311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nStride = ALIGN(drv_ctx.video_resolution.frame_width, 16); 1021411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.frame_height; 1021511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1021611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("update_portdef(%u): Width = %u Height = %u Stride = %d " 1021711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "SliceHeight = %u eColorFormat = %d nBufSize %u nBufCnt %u", 1021811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nPortIndex, 1021911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameWidth, 1022011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameHeight, 1022111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->format.video.nStride, 1022211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nSliceHeight, 1022311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.eColorFormat, 1022411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nBufferSize, 1022511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nBufferCountActual); 1022611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1022711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1022811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1022911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1023011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_output_headers() 1023111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1023211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1023311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufHdr = NULL; 1023411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i= 0; 1023511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1023611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_out_mem_ptr) { 1023711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation"); 1023811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nBufHdrSize = 0; 1023911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPlatformEntrySize = 0; 1024011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPlatformListSize = 0; 1024111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPMEMInfoSize = 0; 1024211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 1024311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 1024411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 1024511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1024611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Setting First Output Buffer(%d)", 1024711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 1024811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufHdrSize = drv_ctx.op_buf.actualcount * 1024911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_BUFFERHEADERTYPE); 1025011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1025111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPMEMInfoSize = drv_ctx.op_buf.actualcount * 1025211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO); 1025311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPlatformListSize = drv_ctx.op_buf.actualcount * 1025411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST); 1025511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPlatformEntrySize = drv_ctx.op_buf.actualcount * 1025611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY); 1025711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1025811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize, 1025911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)sizeof(OMX_BUFFERHEADERTYPE), 1026011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPMEMInfoSize, 1026111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPlatformListSize); 1026211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("PE %d bmSize % " PRId64 , nPlatformEntrySize, 1026311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count); 1026411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 1026511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Alloc mem for platform specific info 1026611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char *pPtr=NULL; 1026711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize + 1026811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPMEMInfoSize,1); 1026911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \ 1027011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct vdec_bufferpayload), 1027111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 1027211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo *)\ 1027311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof (struct vdec_output_frameinfo), 1027411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 1027511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) { 1027611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer"); 1027711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1027811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1027911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1028011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 1028111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \ 1028211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount); 1028311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.op_buf_ion_info) { 1028411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info"); 1028511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1028611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1028711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1028811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dynamic_buf_mode) { 1028911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list = (struct dynamic_buf_list *) \ 1029011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct dynamic_buf_list), drv_ctx.op_buf.actualcount); 1029111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (out_dynamic_list) { 1029211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (unsigned int i = 0; i < drv_ctx.op_buf.actualcount; i++) 1029311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].dup_fd = -1; 1029411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1029511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1029611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1029711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer 1029811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && drv_ctx.ptr_respbuffer) { 1029911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr = m_out_mem_ptr; 1030011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr); 1030111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *) 1030211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((char *) m_platform_list) + nPlatformListSize); 1030311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 1030411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((char *) m_platform_entry) + nPlatformEntrySize); 1030511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList = m_platform_list; 1030611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry = m_platform_entry; 1030711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo = m_pmem_info; 1030811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1030911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 1031011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1031111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Settting the entire storage nicely 1031211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, 1031311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr,pPlatformEntry); 1031411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo); 1031511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i < drv_ctx.op_buf.actualcount ; i++) { 1031611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 1031711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 1031811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Set the values when we determine the right HxW param 1031911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nAllocLen = 0; 1032011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nFilledLen = 0; 1032111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pAppPrivate = NULL; 1032211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1032311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry->type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 1032411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry->entry = pPMEMInfo; 1032511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Initialize the Platform List 1032611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList->nEntries = 1; 1032711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList->entryList = pPlatformEntry; 1032811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Keep pBuffer NULL till vdec is opened 1032911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pBuffer = NULL; 1033011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo->offset = 0; 1033111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo->pmem_fd = -1; 1033211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pPlatformPrivate = pPlatformList; 1033311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = -1; 1033411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 1033511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].ion_device_fd =-1; 1033611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1033711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Create a mapping between buffers*/ 1033811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 1033911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer[i].client_data = (void *) \ 1034011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.ptr_outputbuffer[i]; 1034111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Move the buffer and buffer header pointers 1034211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr++; 1034311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPMEMInfo++; 1034411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformEntry++; 1034511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPlatformList++; 1034611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1034711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1034811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\ 1034911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr, pPtr); 1035011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 1035111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_out_mem_ptr); 1035211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = NULL; 1035311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1035411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pPtr) { 1035511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(pPtr); 1035611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pPtr = NULL; 1035711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1035811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer) { 1035911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ptr_outputbuffer); 1036011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = NULL; 1036111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1036211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_respbuffer) { 1036311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ptr_respbuffer); 1036411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = NULL; 1036511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1036611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 1036711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.op_buf_ion_info) { 1036811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free o/p ion context"); 1036911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.op_buf_ion_info); 1037011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = NULL; 1037111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1037211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1037311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1037411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1037511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1037611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 1037711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1037811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1037911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1038011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1038111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::complete_pending_buffer_done_cbs() 1038211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1038311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1, p2, ident; 1038411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_cmd_queue tmp_q, pending_bd_q; 1038511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 1038611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // pop all pending GENERATE FDB from ftb queue 1038711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_ftb_q.m_size) { 1038811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.pop_entry(&p1,&p2,&ident); 1038911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_FBD) { 1039011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_bd_q.insert_entry(p1,p2,ident); 1039111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1039211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.insert_entry(p1,p2,ident); 1039311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1039411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1039511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //return all non GENERATE FDB to ftb queue 1039611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (tmp_q.m_size) { 1039711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.pop_entry(&p1,&p2,&ident); 1039811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.insert_entry(p1,p2,ident); 1039911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1040011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // pop all pending GENERATE EDB from etb queue 1040111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_etb_q.m_size) { 1040211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.pop_entry(&p1,&p2,&ident); 1040311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_EBD) { 1040411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_bd_q.insert_entry(p1,p2,ident); 1040511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1040611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.insert_entry(p1,p2,ident); 1040711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1040811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1040911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //return all non GENERATE FDB to etb queue 1041011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (tmp_q.m_size) { 1041111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.pop_entry(&p1,&p2,&ident); 1041211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.insert_entry(p1,p2,ident); 1041311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1041411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 1041511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // process all pending buffer dones 1041611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (pending_bd_q.m_size) { 1041711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_bd_q.pop_entry(&p1,&p2,&ident); 1041811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (ident) { 1041911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EBD: 1042011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 1042111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!"); 1042211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 1042311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1042411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1042511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1042611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_FBD: 1042711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 1042811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!"); 1042911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 1043011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1043111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1043211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1043311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1043411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1043511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1043611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp) 1043711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1043811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 new_frame_interval = 0; 1043911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts 1044011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && llabs(act_timestamp - prev_ts) > 2000) { 1044111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_frame_interval = client_set_fps ? frm_int : (act_timestamp - prev_ts) > 0 ? 1044211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel llabs(act_timestamp - prev_ts) : llabs(act_timestamp - prev_ts_actual); 1044311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (new_frame_interval != frm_int || frm_int == 0) { 1044411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int = new_frame_interval; 1044511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frm_int) { 1044611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = 1e6; 1044711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator = frm_int; 1044811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)", 1044911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator / 1045011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (float)drv_ctx.frame_rate.fps_denominator); 1045111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_control.request_cores(frm_int); 1045211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* We need to report the difference between this FBD and the previous FBD 1045311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * back to the driver for clock scaling purposes. */ 1045411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_outputparm oparm; 1045511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*XXX: we're providing timing info as seconds per frame rather than frames 1045611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * per second.*/ 1045711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 1045811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 1045911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1046011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_streamparm sparm; 1046111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1046211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.parm.output = oparm; 1046311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) { 1046411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \ 1046511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel performance might be affected"); 1046611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1046711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1046811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1046911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1047011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1047111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = act_timestamp; 1047211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1047311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1047411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp) 1047511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1047611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rst_prev_ts && VALID_TS(act_timestamp)) { 1047711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = act_timestamp; 1047811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts_actual = act_timestamp; 1047911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = false; 1048011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (VALID_TS(prev_ts)) { 1048111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool codec_cond = (drv_ctx.timestamp_adjust)? 1048211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!VALID_TS(act_timestamp) || act_timestamp < prev_ts_actual || llabs(act_timestamp - prev_ts_actual) <= 2000) : 1048311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!VALID_TS(act_timestamp) || act_timestamp <= prev_ts_actual); 1048411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts_actual = act_timestamp; //unadjusted previous timestamp 1048511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frm_int > 0 && codec_cond) { 1048611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp); 1048711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel act_timestamp = prev_ts + frm_int; 1048811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp); 1048911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = act_timestamp; 1049011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1049111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.picture_order == VDEC_ORDER_DISPLAY && act_timestamp < prev_ts) { 1049211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // ensure that timestamps can never step backwards when in display order 1049311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel act_timestamp = prev_ts; 1049411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1049511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel set_frame_rate(act_timestamp); 1049611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1049711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (frm_int > 0) // In this case the frame rate was set along 1049811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { // with the port definition, start ts with 0 1049911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel act_timestamp = prev_ts = 0; // and correct if a valid ts is received. 1050011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = true; 1050111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1050211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1050311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1050411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_BUFFERHEADERTYPE* omx_vdec::get_omx_output_buffer_header(int index) 1050511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1050611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return m_out_mem_ptr + index; 1050711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1050811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 10509fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::convert_color_space_info(OMX_U32 primaries, OMX_U32 range, 10510fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space, ColorAspects *aspects) 10511fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 10512fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch (primaries) { 10513fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_BT709_5: 10514fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel *color_space = ITU_R_709; 10515fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT709_5; 10516fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10517fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_BT470_6_M: 10518fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT470_6M; 10519fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10520fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_BT601_6_625: 10521fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625; 10522fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10523fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_BT601_6_525: 10524fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel *color_space = range ? ITU_R_601_FR : ITU_R_601; 10525fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT601_6_525; 10526fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10527fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_GENERIC_FILM: 10528fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesGenericFilm; 10529fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10530fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_BT2020: 10531fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT2020; 10532fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10533fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_UNSPECIFIED: 10534fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel //Client does not expect ColorAspects::PrimariesUnspecified, but rather the supplied default 10535fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 10536fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel //aspects->mPrimaries = ColorAspects::PrimariesOther; 10537fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries; 10538fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10539fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10540fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10541fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = range ? ColorAspects::RangeFull : ColorAspects::RangeLimited; 10542fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10543fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch (transfer) { 10544fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_BT709_5: 10545fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_601_6_525: // case MSM_VIDC_TRANSFER_601_6_625: 10546fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10547fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10548fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_BT_470_6_M: 10549fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferGamma22; 10550fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10551fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_BT_470_6_BG: 10552fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferGamma28; 10553fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10554fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_SMPTE_240M: 10555fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE240M; 10556fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10557fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_LINEAR: 10558fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferLinear; 10559fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10560fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_IEC_61966: 10561fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferXvYCC; 10562fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10563fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_BT_1361: 10564fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferBT1361; 10565fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10566fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_TRANSFER_SRGB: 10567fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSRGB; 10568fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10569fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 10570fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel //aspects->mTransfer = ColorAspects::TransferOther; 10571fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = m_client_color_space.sAspects.mTransfer; 10572fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10573fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10574fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10575fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch (matrix) { 10576fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_BT_709_5: 10577fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5; 10578fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10579fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_FCC_47: 10580fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT470_6M; 10581fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10582fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_601_6_625: 10583fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_601_6_525: 10584fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6; 10585fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10586fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_SMPTE_240M: 10587fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixSMPTE240M; 10588fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10589fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_BT_2020: 10590fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020; 10591fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10592fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_MATRIX_BT_2020_CONST: 10593fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020Constant; 10594fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10595fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 10596fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel //aspects->mMatrixCoeffs = ColorAspects::MatrixOther; 10597fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs; 10598fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10599fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10600fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 10601fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10602fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::print_debug_color_aspects(ColorAspects *aspects, const char *prefix) { 10603fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("%s : Color aspects : Primaries = %d Range = %d Transfer = %d MatrixCoeffs = %d", 10604fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel prefix, aspects->mPrimaries, aspects->mRange, aspects->mTransfer, aspects->mMatrixCoeffs); 10605fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 10606fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10607fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelbool omx_vdec::handle_color_space_info(void *data, unsigned int buf_index) 10608fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 10609fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel ColorSpace_t color_space = ITU_R_601; 10610fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel ColorAspects tempAspects; 10611fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset(&tempAspects, 0x0, sizeof(ColorAspects)); 10612fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel ColorAspects *aspects = &tempAspects; 10613fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10614fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch(output_capability) { 10615fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_MPEG2: 10616fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 10617fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload; 10618fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data; 10619fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10620fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* Refer MPEG2 Spec @ Rec. ISO/IEC 13818-2, ITU-T Draft Rec. H.262 to 10621fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * understand this code */ 10622fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10623fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (seqdisp_payload && seqdisp_payload->color_descp) { 10624fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10625fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel convert_color_space_info(seqdisp_payload->color_primaries, 1, 10626fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel seqdisp_payload->transfer_char, seqdisp_payload->matrix_coeffs, 10627fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel &color_space,aspects); 10628fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_disp_hor_size = seqdisp_payload->disp_width; 10629fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_disp_vert_size = seqdisp_payload->disp_height; 10630fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10631fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10632fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10633fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_H264: 10634fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_HEVC: 10635fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 10636fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct msm_vidc_vui_display_info_payload *display_info_payload; 10637fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel display_info_payload = (struct msm_vidc_vui_display_info_payload*)data; 10638fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10639fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* Refer H264 Spec @ Rec. ITU-T H.264 (02/2014) to understand this code */ 10640fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10641fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (display_info_payload->video_signal_present_flag && 10642fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel display_info_payload->color_description_present_flag) { 10643fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel convert_color_space_info(display_info_payload->color_primaries, 10644fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel display_info_payload->video_full_range_flag, 10645fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel display_info_payload->transfer_characteristics, 10646fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel display_info_payload->matrix_coefficients, 10647fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel &color_space,aspects); 10648fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10649fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10650fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10651fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VC1_ANNEX_G: 10652fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VC1_ANNEX_L: 10653fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 10654fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct msm_vidc_vc1_seqdisp_payload *vc1_seq_disp_payload; 10655fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vc1_seq_disp_payload = (struct msm_vidc_vc1_seqdisp_payload*)data; 10656fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10657fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* Refer VC-1 Spec @ SMPTE Draft Standard for Television Date: 2005-08-23 10658fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * SMPTE 421M to understand this code */ 10659fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10660fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_enable_android_native_buffers && 10661fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vc1_seq_disp_payload->color_primaries) { 10662fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10663fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel convert_color_space_info(vc1_seq_disp_payload->color_primaries, 10664fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 1, 10665fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vc1_seq_disp_payload->transfer_char, 10666fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vc1_seq_disp_payload->matrix_coeffs, 10667fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel &color_space,aspects); 10668fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10669fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10670fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10671fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VP8: 10672fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 10673fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload; 10674fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data; 10675fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10676fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* Refer VP8 Data Format in latest VP8 spec and Decoding Guide November 2011 10677fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * to understand this code */ 10678fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10679fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (vpx_color_space_payload->color_space == 0) { 10680fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = ITU_R_601; 10681fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 10682fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Unsupported Color space for VP8"); 10683fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10684fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10685fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10686fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10687fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VP9: 10688fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 10689fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload; 10690fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data; 10691fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10692fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* Refer VP9 Spec @ VP9 Bitstream & Decoding Process Specification - v0.6 31st March 2016 10693fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * to understand this code */ 10694fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10695fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch(vpx_color_space_payload->color_space) { 10696fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_BT_601: 10697fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6; 10698fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10699fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625; 10700fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10701fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10702fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_BT_709: 10703fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = ITU_R_709; 10704fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5; 10705fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10706fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT709_5; 10707fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10708fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10709fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_SMPTE_170: 10710fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5; 10711fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10712fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries; 10713fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10714fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10715fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_SMPTE_240: 10716fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs; 10717fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE240M; 10718fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries; 10719fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10720fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10721fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_BT_2020: 10722fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020; 10723fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects:: TransferSMPTE170M; 10724fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesBT2020; 10725fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10726fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10727fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_RESERVED: 10728fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixOther; 10729fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferOther; 10730fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesOther; 10731fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10732fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10733fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_CS_RGB: 10734fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5; 10735fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mTransfer = ColorAspects::TransferSMPTE170M; 10736fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mPrimaries = ColorAspects::PrimariesOther; 10737fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel aspects->mRange = m_client_color_space.sAspects.mRange; 10738fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10739fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 10740fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10741fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10742fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10743fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10744fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 10745fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 10746fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10747fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_enable_android_native_buffers) { 10748fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry 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); 10749fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel set_colorspace_in_handle(color_space, buf_index); 10750fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10751fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(aspects, "Bitstream"); 10752fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10753fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_internal_color_space.sAspects.mPrimaries != aspects->mPrimaries || 10754fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mTransfer != aspects->mTransfer || 10755fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mMatrixCoeffs != aspects->mMatrixCoeffs || 10756fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.sAspects.mRange != aspects->mRange) { 10757fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(&(m_internal_color_space.sAspects), aspects, sizeof(ColorAspects)); 10758fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_internal_color_space.bDataSpaceChanged = OMX_TRUE; 10759fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10760fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_HIGH("Initiating PORT Reconfig due to Color Aspects Change"); 10761fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(m_internal_color_space.sAspects), "Internal"); 10762fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(m_client_color_space.sAspects), "Client"); 10763fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10764fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel post_event(OMX_CORE_OUTPUT_PORT_INDEX, 10765fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_QTIIndexConfigDescribeColorAspects, 10766fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_COMPONENT_GENERATE_PORT_RECONFIG); 10767fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return true; 10768fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10769fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return false; 10770fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 10771fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10772fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::set_colorspace_in_handle(ColorSpace_t color_space, unsigned int buf_index) { 10773fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel private_handle_t *private_handle = NULL; 10774fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (buf_index < drv_ctx.op_buf.actualcount && 10775fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS && 10776fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel native_buffer[buf_index].privatehandle) { 10777fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel private_handle = native_buffer[buf_index].privatehandle; 10778fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10779fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (private_handle) { 10780fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel setMetaData(private_handle, UPDATE_COLOR_SPACE, (void*)&color_space); 10781fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 10782fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 10783fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 10784fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelvoid omx_vdec::print_debug_hdr_color_info(HDRStaticInfo *hdr_info, const char *prefix) 10785fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{ 10786fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (!hdr_info->mID) { 10787fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mR.x = %d mR.y = %d", prefix, 10788fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mR.x, hdr_info->sType1.mR.y); 10789fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mG.x = %d mG.y = %d", prefix, 10790fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mG.x, hdr_info->sType1.mG.y); 10791fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mB.x = %d mB.y = %d", prefix, 10792fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mB.x, hdr_info->sType1.mB.y); 10793fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mW.x = %d mW.y = %d", prefix, 10794fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mW.x, hdr_info->sType1.mW.y); 10795fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: maxDispLum = %d minDispLum = %d", prefix, 10796fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mMaxDisplayLuminance, hdr_info->sType1.mMinDisplayLuminance); 10797fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("%s : HDRstaticinfo CLL: CLL = %d FLL = %d", prefix, 10798fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mMaxContentLightLevel, hdr_info->sType1.mMaxFrameAverageLightLevel); 10799fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 10800fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10801fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel} 10802fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10803fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10804fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10805fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelbool omx_vdec::handle_content_light_level_info(void* data) 10806fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{ 10807fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel struct msm_vidc_content_light_level_sei_payload *light_level_payload = 10808fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (msm_vidc_content_light_level_sei_payload*)(data); 10809fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10810fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if ((m_internal_hdr_info.sInfo.sType1.mMaxContentLightLevel != light_level_payload->nMaxContentLight) || 10811fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (m_internal_hdr_info.sInfo.sType1.mMaxFrameAverageLightLevel != light_level_payload->nMaxPicAverageLight)) { 10812fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_internal_hdr_info.sInfo.sType1.mMaxContentLightLevel = light_level_payload->nMaxContentLight; 10813fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_internal_hdr_info.sInfo.sType1.mMaxFrameAverageLightLevel = light_level_payload->nMaxPicAverageLight; 10814fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return true; 10815fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 10816fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return false; 10817fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel} 10818fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10819fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelbool omx_vdec::handle_mastering_display_color_info(void* data) 10820fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{ 10821fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel struct msm_vidc_mastering_display_colour_sei_payload *mastering_display_payload = 10822fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (msm_vidc_mastering_display_colour_sei_payload*)(data); 10823fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel HDRStaticInfo* hdr_info = &m_internal_hdr_info.sInfo; 10824fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel bool internal_disp_changed_flag = false; 10825fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10826fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_disp_changed_flag = (hdr_info->sType1.mR.x != mastering_display_payload->nDisplayPrimariesX[0]) || 10827fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (hdr_info->sType1.mR.y != mastering_display_payload->nDisplayPrimariesY[0]); 10828fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_disp_changed_flag |= (hdr_info->sType1.mG.x != mastering_display_payload->nDisplayPrimariesX[1]) || 10829fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (hdr_info->sType1.mG.y != mastering_display_payload->nDisplayPrimariesY[1]); 10830fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_disp_changed_flag |= (hdr_info->sType1.mB.x != mastering_display_payload->nDisplayPrimariesX[2]) || 10831fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (hdr_info->sType1.mB.y != mastering_display_payload->nDisplayPrimariesY[2]); 10832fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10833fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_disp_changed_flag |= (hdr_info->sType1.mW.x != mastering_display_payload->nWhitePointX) || 10834fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (hdr_info->sType1.mW.y != mastering_display_payload->nWhitePointY); 10835fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10836fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_disp_changed_flag != (hdr_info->sType1.mMaxDisplayLuminance != mastering_display_payload->nMaxDisplayMasteringLuminance) || 10837fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (hdr_info->sType1.mMinDisplayLuminance != mastering_display_payload->nMinDisplayMasteringLuminance); 10838fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10839fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (internal_disp_changed_flag) { 10840fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mR.x = mastering_display_payload->nDisplayPrimariesX[0]; 10841fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mR.y = mastering_display_payload->nDisplayPrimariesY[0]; 10842fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mG.x = mastering_display_payload->nDisplayPrimariesX[1]; 10843fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mG.y = mastering_display_payload->nDisplayPrimariesY[1]; 10844fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mB.x = mastering_display_payload->nDisplayPrimariesX[2]; 10845fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mB.y = mastering_display_payload->nDisplayPrimariesY[2]; 10846fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mW.x = mastering_display_payload->nWhitePointX; 10847fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mW.y = mastering_display_payload->nWhitePointY; 10848fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10849fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mMaxDisplayLuminance = mastering_display_payload->nMaxDisplayMasteringLuminance; 10850fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel hdr_info->sType1.mMinDisplayLuminance = mastering_display_payload->nMinDisplayMasteringLuminance; 10851fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 10852fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 10853fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel return internal_disp_changed_flag; 10854fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel} 10855fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 1085611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr) 1085711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 108582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL, *p_client_extra = NULL; 108592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_U8 *pBuffer = NULL; 1086011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 num_conceal_MB = 0; 1086111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TICKS time_stamp = 0; 1086211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 frame_rate = 0; 1086311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long consumed_len = 0; 1086411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 num_MB_in_frame; 1086511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 recovery_sei_flags = 1; 1086611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int enable = OMX_InterlaceFrameProgressive; 10867fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel bool internal_hdr_info_changed_flag = false; 10868fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel bool color_event = false; 1086911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_flush_progress) 1087011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1087111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1087211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int buf_index = p_buf_hdr - m_out_mem_ptr; 1087311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_index >= drv_ctx.extradata_info.count) { 1087411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("handle_extradata: invalid index(%d) max(%d)", 1087511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_index, drv_ctx.extradata_info.count); 1087611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1087711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1087811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_panscan_window_payload *panscan_payload = NULL; 1087911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1088011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[buf_index].bufferaddr == NULL) { 1088111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("handle_extradata: Error: Mapped output buffer address is NULL"); 1088211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1088311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1088411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1088511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.extradata_info.uaddr) { 1088611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("NULL drv_ctx.extradata_info.uaddr"); 1088711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1088811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1088911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && (drv_ctx.extradata_info.buffer_size > (p_buf_hdr->nAllocLen - p_buf_hdr->nFilledLen)) ) { 1089011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Insufficient size allocated for extra-data"); 1089111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = NULL; 1089211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1089311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 108942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (!secure_mode) { 108952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel pBuffer = (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[buf_index].buffer_len, 108962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, drv_ctx.ptr_outputbuffer[buf_index].pmem_fd, 0); 108972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (pBuffer == MAP_FAILED) { 108982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("handle_extradata output buffer mmap failed - errno: %d", errno); 108992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return; 109002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1090111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) 1090211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((unsigned long)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3)); 109032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } else 1090411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = m_other_extradata; 109052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 109062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel AutoUnmap autounmap(pBuffer, drv_ctx.ptr_outputbuffer[buf_index].buffer_len); 109072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (m_client_extradata_info.getBase() && 109082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_client_extradata_info.getSize() >= drv_ctx.extradata_info.buffer_size) { 109092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (m_client_extradata_info.getBase() + 109102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel buf_index * m_client_extradata_info.getSize()); 109112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 109122601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 1091311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size; 1091411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1091511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) { 1091611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = NULL; 1091711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra"); 1091811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1091911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1092011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_crop_updated = OMX_FALSE; 1092111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata; 1092211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (data && p_extra) { 1092311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while ((consumed_len < drv_ctx.extradata_info.buffer_size) 1092411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) { 1092511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((consumed_len + data->nSize) > (unsigned)drv_ctx.extradata_info.buffer_size) { 1092611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Invalid extra data size"); 1092711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1092811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1092911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1093011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) { 1093111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = NULL; 1093211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra"); 1093311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1093411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1093511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 10936fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("handle_extradata: eType = 0x%x", data->eType); 1093711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((unsigned long)data->eType) { 1093811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO: 1093911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_interlace_payload *payload; 1094011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 interlace_color_format; 1094111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel payload = (struct msm_vidc_interlace_payload *)(void *)data->data; 1094211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (payload) { 1094311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enable = OMX_InterlaceFrameProgressive; 1094411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (payload->format) { 1094511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE: 1094611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 1094711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1094811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST: 1094911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 1095011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enable = OMX_InterlaceInterleaveFrameTopFieldFirst; 1095111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1095211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST: 1095311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst; 1095411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enable = OMX_InterlaceInterleaveFrameBottomFieldFirst; 1095511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1095611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1095711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("default case - set to progressive"); 1095811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 1095911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1096011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (payload->color_format) { 1096111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12: 1096211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 1096311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1096411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12_UBWC: 1096511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed; 1096611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1096711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1096811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 1096911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error - Unknown color format hint for interlaced frame"); 1097011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1097111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1097211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1097311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 1097411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("setMetaData INTERLACED format:%d color_format: %x enable:%d mbaff:%d", 1097511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel payload->format, interlace_color_format ,enable, 1097611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (p_buf_hdr->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF)?true:false); 1097711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1097811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 1097911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PP_PARAM_INTERLACED, (void*)&enable); 1098011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1098111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (interlace_color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) { 1098211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 1098311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel LINEAR_FORMAT, (void*)&interlace_color_format); 10984fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (interlace_color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) { 10985fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle, 10986fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel LINEAR_FORMAT, NULL); 1098711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1098811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1098911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_INTERLACE_EXTRADATA) { 1099011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_interlace_extradata(p_extra, payload->format); 109912601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 109922601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 109932601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_interlace_extradata(p_client_extra, payload->format); 109942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) 109952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (((OMX_U8 *)p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 109962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1099711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1099811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1099911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_FRAME_RATE: 1100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_framerate_payload *frame_rate_payload; 1100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_rate_payload = (struct msm_vidc_framerate_payload *)(void *)data->data; 1100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_rate = frame_rate_payload->frame_rate; 1100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_TIMESTAMP: 1100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_ts_payload *time_stamp_payload; 1100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp_payload = (struct msm_vidc_ts_payload *)(void *)data->data; 1100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp = time_stamp_payload->timestamp_lo; 1100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32); 1100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->nTimeStamp = time_stamp; 1101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB: 1101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_concealmb_payload *conceal_mb_payload; 1101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel conceal_mb_payload = (struct msm_vidc_concealmb_payload *)(void *)data->data; 1101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 1101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.video_resolution.frame_height + 15)) >> 8; 1101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0); 1101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_INDEX: 1101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int *etype; 1102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel etype = (int *)(void *)data->data; 1102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (etype && *etype == MSM_VIDC_EXTRADATA_ASPECT_RATIO) { 1102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload; 1102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)(++etype); 1102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (aspect_ratio_payload) { 1102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((struct vdec_output_frameinfo *) 1102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width; 1102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((struct vdec_output_frameinfo *) 1102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height; 1102911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (etype && *etype == MSM_VIDC_EXTRADATA_OUTPUT_CROP) { 1103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_output_crop_payload *output_crop_payload; 1103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_crop_payload = (struct msm_vidc_output_crop_payload *)(++etype); 1103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_crop_payload) { 1103411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_crop_rect.nLeft = output_crop_payload->left; 1103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_crop_rect.nTop = output_crop_payload->top; 1103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_crop_rect.nWidth = output_crop_payload->left + output_crop_payload->display_width; 1103711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_crop_rect.nHeight = output_crop_payload->top + output_crop_payload->display_height; 1103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_width = output_crop_payload->width; 1103911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_height = output_crop_payload->height; 1104011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata_info.output_crop_updated = OMX_TRUE; 1104111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1104211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1104311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1104411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI: 1104511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_recoverysei_payload *recovery_sei_payload; 1104611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)(void *)data->data; 1104711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel recovery_sei_flags = recovery_sei_payload->flags; 1104811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) { 1104911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT; 1105011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("***************************************************"); 1105111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received"); 1105211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("***************************************************"); 1105311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1105411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1105511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW: 1105611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel panscan_payload = (struct msm_vidc_panscan_window_payload *)(void *)data->data; 1105711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (panscan_payload->num_panscan_windows > MAX_PAN_SCAN_WINDOWS) { 1105811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Panscan windows are more than supported\n"); 1105911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Max supported = %d FW returned = %d\n", 1106011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAX_PAN_SCAN_WINDOWS, panscan_payload->num_panscan_windows); 1106111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1106211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1106311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1106411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_MPEG2_SEQDISP: 11065fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_EXTRADATA_VUI_DISPLAY_INFO: 11066fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_EXTRADATA_VC1_SEQDISP: 11067fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO: 11068fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel color_event = handle_color_space_info((void *)data->data, buf_index); 1106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_S3D_FRAME_PACKING: 1107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload; 1107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel s3d_frame_packing_payload = (struct msm_vidc_s3d_frame_packing_payload *)(void *)data->data; 1107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (s3d_frame_packing_payload->fpa_type) { 1107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_FRAMEPACK_SIDE_BY_SIDE: 1107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (s3d_frame_packing_payload->content_interprtation_type == 1) 1107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stereo_output_mode = HAL_3D_SIDE_BY_SIDE_L_R; 1107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (s3d_frame_packing_payload->content_interprtation_type == 2) 1107811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stereo_output_mode = HAL_3D_SIDE_BY_SIDE_R_L; 1107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 1108011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unsupported side-by-side framepacking type"); 1108111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stereo_output_mode = HAL_NO_3D; 1108211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_FRAMEPACK_TOP_BOTTOM: 1108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stereo_output_mode = HAL_3D_TOP_BOTTOM; 1108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unsupported framepacking type"); 1108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stereo_output_mode = HAL_NO_3D; 1109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("setMetaData FRAMEPACKING : fpa_type = %u, content_interprtation_type = %u, stereo_output_mode= %d", 1109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel s3d_frame_packing_payload->fpa_type, s3d_frame_packing_payload->content_interprtation_type, stereo_output_mode); 1109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_FRAMEPACK_EXTRADATA) { 1109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_framepack_extradata(p_extra, s3d_frame_packing_payload); 110952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 110962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 110972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_framepack_extradata(p_client_extra, s3d_frame_packing_payload); 110982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 110992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_FRAME_QP: 1110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_frame_qp_payload *qp_payload; 1110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qp_payload = (struct msm_vidc_frame_qp_payload*)(void *)data->data; 1110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_QP_EXTRADATA) { 1110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_qp_extradata(p_extra, qp_payload); 111072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 111082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 111092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_qp_extradata(p_client_extra, qp_payload); 111102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 111112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_FRAME_BITS_INFO: 1111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_frame_bits_info_payload *bits_info_payload; 1111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bits_info_payload = (struct msm_vidc_frame_bits_info_payload*)(void *)data->data; 1111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_BITSINFO_EXTRADATA) { 1111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_bitsinfo_extradata(p_extra, bits_info_payload); 111192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 111202601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 111212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_bitsinfo_extradata(p_client_extra, bits_info_payload); 111222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 111232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1112511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_STREAM_USERDATA: 1112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_EXTNUSER_EXTRADATA) { 1112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_user_extradata(p_extra, data); 111292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 111302601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 111312601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_user_extradata(p_client_extra, data); 111322601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 111332601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1113411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_VQZIP_SEI: 1113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_vqzip_sei_payload *vqzip_payload; 1113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vqzip_payload = (struct msm_vidc_vqzip_sei_payload*)(void *)data->data; 1113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_VQZIPSEI_EXTRADATA) { 1114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 1114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_vqzip_extradata(p_extra, vqzip_payload); 111422601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 111432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 111442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_vqzip_extradata(p_client_extra, vqzip_payload); 111452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 111462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 11149fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel case MSM_VIDC_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI: 11150fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_hdr_info_changed_flag |= handle_content_light_level_info((void*)data->data); 11151fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel break; 11152fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel case MSM_VIDC_EXTRADATA_MASTERING_DISPLAY_COLOUR_SEI: 11153fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel internal_hdr_info_changed_flag |= handle_mastering_display_color_info((void*)data->data); 11154fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel break; 1115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Unrecognized extradata"); 1115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto unrecognized_extradata; 1115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel consumed_len += data->nSize; 1116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 1116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_FRAMEINFO_EXTRADATA) { 1116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 1116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_frame_info_extradata(p_extra, 1116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate, 1116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel time_stamp, panscan_payload,&((struct vdec_output_frameinfo *) 1116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info); 111682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 111692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 111702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_frame_info_extradata(p_client_extra, 111712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate, 111722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel time_stamp, panscan_payload,&((struct vdec_output_frameinfo *) 111732601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info); 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 if (client_extradata & OMX_FRAMEDIMENSION_EXTRADATA) { 1117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_frame_dimension_extradata(p_extra); 111792601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4)); 111802601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 111812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_frame_dimension_extradata(p_client_extra); 111822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4)); 111832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 11185fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 11186fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if(internal_hdr_info_changed_flag) { 11187fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel print_debug_hdr_color_info(&(m_internal_hdr_info.sInfo), "Internal"); 11188fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel print_debug_hdr_color_info(&(m_client_hdr_info.sInfo), "Client"); 11189fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel auto_lock lock(m_hdr_info_client_lock); 11190fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_change_client_hdr_info = true; 11191fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if(!color_event) { 11192fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_HIGH("Initiating PORT Reconfig due to HDR Info Change"); 11193fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel post_event(OMX_CORE_OUTPUT_PORT_INDEX, 11194fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel OMX_QTIIndexConfigDescribeHDRColorInfo, 11195fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel OMX_COMPONENT_GENERATE_PORT_RECONFIG); 11196fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 11197fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 11198fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 1119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunrecognized_extradata: 1120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata && p_extra) { 1120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA; 1120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel append_terminator_extradata(p_extra); 112042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (p_client_extra) { 112052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel append_terminator_extradata(p_client_extra); 112062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 1120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_mode && p_extradata && m_other_extradata) { 1120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_output_frameinfo *ptr_extradatabuff = NULL; 1121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(p_extradata, m_other_extradata, drv_ctx.extradata_info.buffer_size); 1121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_extradatabuff = (struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate; 1121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_extradatabuff->metadata_info.metabufaddr = (void *)p_extradata; 1121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_extradatabuff->metadata_info.size = drv_ctx.extradata_info.buffer_size; 1121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_extradatabuff->metadata_info.fd = drv_ctx.extradata_info.ion.fd_ion_data.fd; 1121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_extradatabuff->metadata_info.offset = buf_index * drv_ctx.extradata_info.buffer_size; 1121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_extradatabuff->metadata_info.buffer_size = drv_ctx.extradata_info.size; 1121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11221fa202b9b18f17f7835fd602db5fff530e61112b4Thierry StrudelOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U64 requested_extradata, 1122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool is_internal, bool enable) 1122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 1122511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 1122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateLoaded) { 1122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only"); 1122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 1122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%u] requested[%u] enable[%d], is_internal: %d", 1123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)client_extradata, (unsigned int)requested_extradata, enable, is_internal); 1123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!is_internal) { 1123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable) 1123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata |= requested_extradata; 1123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 1123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata = client_extradata & ~requested_extradata; 1123811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1123911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable) { 1124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_INTERLACE_EXTRADATA) { 1124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO; 1124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1124511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set interlaced extradata." 1124611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Quality of interlaced clips might be impacted."); 1124711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) { 1125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1125111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE; 1125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set framerate extradata"); 1125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB; 1125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set concealed MB extradata"); 1125911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1126111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI; 1126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata"); 1126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW; 1126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 1126911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1127011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO; 1127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 1127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_capability == V4L2_PIX_FMT_MPEG2) { 1127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP; 1127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set panscan extradata"); 1128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_TIMEINFO_EXTRADATA) { 1128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP; 1128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set timeinfo extradata"); 1128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && (requested_extradata & OMX_FRAMEPACK_EXTRADATA)) { 1129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_capability == V4L2_PIX_FMT_H264) { 1129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("enable OMX_FRAMEPACK_EXTRADATA"); 1129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_S3D_FRAME_PACKING; 1129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set S3D_FRAME_PACKING extradata"); 1129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX_FRAMEPACK_EXTRADATA supported for H264 only"); 1130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_QP_EXTRADATA) { 1130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP; 1130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set QP extradata"); 1130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_BITSINFO_EXTRADATA) { 1131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_BITS_INFO; 1131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set frame bits info extradata"); 1131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && (requested_extradata & OMX_EXTNUSER_EXTRADATA)) { 1131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_STREAM_USERDATA; 1131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set stream userdata extradata"); 1132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_VQZIPSEI_EXTRADATA) { 1132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_VQZIP_SEI; 1132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set VQZip SEI extradata"); 1132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata |= OMX_VQZIPSEI_EXTRADATA; 1133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP; 1133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set QP extradata"); 1133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata |= OMX_QP_EXTRADATA; 1133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_extradata & OMX_OUTPUTCROP_EXTRADATA) { 1133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 1134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_OUTPUT_CROP; 1134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Enable output crop extra data"); 1134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set output crop extradata"); 1134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 11346fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (requested_extradata & OMX_DISPLAY_INFO_EXTRADATA) { 11347fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 11348fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch(output_capability) { 11349fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_H264: 11350fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_HEVC: 11351fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_VUI_DISPLAY; 11352fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 11353fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case CODEC_TYPE_MPEG2: 11354fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP; 11355fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 11356fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VP8: 11357fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VP9: 11358fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_VPX_COLORSPACE; 11359fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 11360fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VC1_ANNEX_G: 11361fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VC1_ANNEX_L: 11362fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_VC1_SEQDISP; 11363fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 11364fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 11365fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("Don't support Disp info for this codec : %s", drv_ctx.kind); 11366fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return ret; 11367fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 11368fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 11369fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 11370fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("Failed to set Display info extradata"); 11371fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 11372fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 11373fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (requested_extradata & OMX_HDR_COLOR_INFO_EXTRADATA) { 11374fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 11375fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (output_capability == V4L2_PIX_FMT_H264 || 11376fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel output_capability == V4L2_PIX_FMT_HEVC) { 11377fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_DISPLAY_COLOUR_SEI; 11378fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 11379fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_HIGH("Failed to set Display Colour SEI extradata"); 11380fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 11381fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI; 11382fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 11383fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_HIGH("Failed to set Content Light Level SEI extradata"); 11384fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 11385fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 11386fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 1138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = get_buffer_req(&drv_ctx.op_buf); 1138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 1139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra) 1139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0; 1139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *data_ptr = extra->data, data = 0; 1139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (byte_count < extra->nDataSize) { 1139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data = *data_ptr; 1139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (data) { 1139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_MB += (data&0x01); 1140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data >>= 1; 1140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data_ptr++; 1140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel byte_count++; 1140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) * 1140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.video_resolution.frame_height + 15)) >> 8; 1140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0); 1140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra) 1141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug_extradata || !extra) 1141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "============== Extra Data ==============\n" 1141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Size: %u\n" 1141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Version: %u\n" 1142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " PortIndex: %u\n" 1142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Type: %x\n" 1142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " DataSize: %u", 1142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)extra->nSize, (unsigned int)extra->nVersion.nVersion, 1142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)extra->nPortIndex, extra->eType, (unsigned int)extra->nDataSize); 1142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) { 1142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data; 1142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "------ Interlace Format ------\n" 1143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Size: %u\n" 1143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Version: %u\n" 1143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " PortIndex: %u\n" 1143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Is Interlace Format: %d\n" 1143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Interlace Formats: %u\n" 1143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "=========== End of Interlace ===========", 1143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)intfmt->nSize, (unsigned int)intfmt->nVersion.nVersion, (unsigned int)intfmt->nPortIndex, 1143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intfmt->bInterlaceFormat, (unsigned int)intfmt->nInterlaceFormats); 1143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) { 1143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data; 1144011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "-------- Frame Format --------\n" 1144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Picture Type: %d\n" 1144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Interlace Type: %d\n" 1144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Pan Scan Total Frame Num: %u\n" 1144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Concealed Macro Blocks: %u\n" 1144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame rate: %u\n" 1144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Time Stamp: %llu\n" 1144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Aspect Ratio X: %u\n" 1145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Aspect Ratio Y: %u", 1145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fminfo->ePicType, 1145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fminfo->interlaceType, 1145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)fminfo->panScan.numWindows, 1145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)fminfo->nConcealedMacroblocks, 1145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)fminfo->nFrameRate, 1145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fminfo->nTimeStamp, 1145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)fminfo->aspectRatio.aspectRatioX, 1145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)fminfo->aspectRatio.aspectRatioY); 1145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) { 1146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "------------------------------" 1146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Pan Scan Frame Num: %u\n" 1146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Rectangle x: %d\n" 1146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Rectangle y: %d\n" 1146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Rectangle dx: %d\n" 1146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Rectangle dy: %d", 1146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)i, (unsigned int)fminfo->panScan.window[i].x, (unsigned int)fminfo->panScan.window[i].y, 1146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)fminfo->panScan.window[i].dx, (unsigned int)fminfo->panScan.window[i].dy); 1147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("========= End of Frame Format =========="); 1147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement) { 1147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data; 1147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "------------------ Framepack Format ----------\n" 1147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " id: %u \n" 1147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " cancel_flag: %u \n" 1147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " type: %u \n" 1148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " quincunx_sampling_flagFormat: %u \n" 1148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " content_interpretation_type: %u \n" 1148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " spatial_flipping_flag: %u \n" 1148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame0_flipped_flag: %u \n" 1148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " field_views_flag: %u \n" 1148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " current_frame_is_frame0_flag: %u \n" 1148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame0_self_contained_flag: %u \n" 1148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame1_self_contained_flag: %u \n" 1148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame0_grid_position_x: %u \n" 1148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame0_grid_position_y: %u \n" 1149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame1_grid_position_x: %u \n" 1149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " frame1_grid_position_y: %u \n" 1149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " reserved_byte: %u \n" 1149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " repetition_period: %u \n" 1149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " extension_flag: %u \n" 1149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "================== End of Framepack ===========", 1149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->id, 1149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->cancel_flag, 1149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->type, 1149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->quincunx_sampling_flag, 1150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->content_interpretation_type, 1150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->spatial_flipping_flag, 1150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame0_flipped_flag, 1150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->field_views_flag, 1150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->current_frame_is_frame0_flag, 1150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame0_self_contained_flag, 1150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame1_self_contained_flag, 1150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame0_grid_position_x, 1150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame0_grid_position_y, 1150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame1_grid_position_x, 1151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->frame1_grid_position_y, 1151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->reserved_byte, 1151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->repetition_period, 1151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)framepack->extension_flag); 1151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataQP) { 1151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_QP * qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data; 1151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "---- QP (Frame quantization parameter) ----\n" 1151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Frame QP: %u \n" 1151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "================ End of QP ================\n", 1152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)qp->nQP); 1152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo) { 1152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_BITS_INFO * bits = (OMX_QCOM_EXTRADATA_BITS_INFO *)(void *)extra->data; 1152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "--------- Input bits information --------\n" 1152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Header bits: %u \n" 1152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Frame bits: %u \n" 1152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "===== End of Input bits information =====\n", 1152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)bits->header_bits, (unsigned int)bits->frame_bits); 1152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData) { 1153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_USERDATA *userdata = (OMX_QCOM_EXTRADATA_USERDATA *)(void *)extra->data; 1153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *data_ptr = (OMX_U8 *)userdata->data; 1153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 userdata_size = extra->nDataSize - sizeof(userdata->type); 1153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 i = 0; 1153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "-------------- Userdata -------------\n" 1153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Stream userdata type: %u\n" 1153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " userdata size: %u\n" 1153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " STREAM_USERDATA:", 1153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)userdata->type, (unsigned int)userdata_size); 1154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < userdata_size; i+=4) { 1154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" %x %x %x %x", 1154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data_ptr[i], data_ptr[i+1], 1154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data_ptr[i+2], data_ptr[i+3]); 1154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "=========== End of Userdata ==========="); 1154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI) { 1154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_VQZIPSEI *vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data; 1154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( 1155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "-------------- VQZip -------------\n" 1155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " Size: %u\n", 1155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)vq->nSize); 1155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH( "=========== End of VQZip ==========="); 1155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra->eType == OMX_ExtraDataNone) { 1155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("========== End of Terminator ==========="); 1155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("======= End of Driver Extradata ========"); 1155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 interlaced_format_type) 1156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STREAMINTERLACEFORMAT *interlace_format; 1156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) { 1156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!extra) { 1157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: append_interlace_extradata - invalid input"); 1157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE; 1157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat; 1157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT); 1157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data; 1157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT); 1158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nVersion.nVersion = OMX_SPEC_VERSION; 1158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) { 1158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->bInterlaceFormat = OMX_FALSE; 1158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive; 1158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 1158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST) { 1158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->bInterlaceFormat = OMX_TRUE; 1158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst; 1159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst; 1159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST) { 1159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->bInterlaceFormat = OMX_TRUE; 1159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameBottomFieldFirst; 1159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst; 1159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //default case - set to progressive 1159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->bInterlaceFormat = OMX_FALSE; 1159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive; 1159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = VDEC_InterlaceFrameProgressive; 1160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_frame_dimension_extradata(OMX_OTHER_EXTRADATATYPE *extra) 1160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_FRAMEDIMENSION *frame_dimension; 1160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!(client_extradata & OMX_FRAMEDIMENSION_EXTRADATA)) { 1160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_FRAMEDIMENSION_EXTRADATA_SIZE; 1161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameDimension; 1161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEDIMENSION); 1161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_dimension = (OMX_QCOM_EXTRADATA_FRAMEDIMENSION *)(void *)extra->data; 1161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_dimension->nDecWidth = rectangle.nLeft; 1161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_dimension->nDecHeight = rectangle.nTop; 1161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_dimension->nActualWidth = rectangle.nWidth; 1161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_dimension->nActualHeight = rectangle.nHeight; 1162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::fill_aspect_ratio_info( 1162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_aspectratioinfo *aspect_ratio_info, 1162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info) 1162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata = frame_info; 1162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width; 1162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height; 1162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("aspectRatioX %u aspectRatioY %u", (unsigned int)m_extradata->aspectRatio.aspectRatioX, 1163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)m_extradata->aspectRatio.aspectRatioY); 1163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate, 1163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TICKS time_stamp, struct msm_vidc_panscan_window_payload *panscan_payload, 1163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_aspectratioinfo *aspect_ratio_info) 1163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL; 1163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_panscan_window *panscan_window; 1164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) { 1164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE; 1164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo; 1164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO); 1164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data; 1164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (picture_type) { 1165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case PICTURE_TYPE_I: 1165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->ePicType = OMX_VIDEO_PictureTypeI; 1165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case PICTURE_TYPE_P: 1165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->ePicType = OMX_VIDEO_PictureTypeP; 1165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case PICTURE_TYPE_B: 1165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->ePicType = OMX_VIDEO_PictureTypeB; 1165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0; 1166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst) 1166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 1166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst) 1166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 1166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 1166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive; 1166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio)); 1166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->nConcealedMacroblocks = num_conceal_mb; 1167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->nFrameRate = frame_rate; 1167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->nTimeStamp = time_stamp; 1167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->panScan.numWindows = 0; 1167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_capability == V4L2_PIX_FMT_MPEG2) { 1167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_disp_hor_size && m_disp_vert_size) { 1167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size; 1167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size; 1167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->displayAspectRatio.displayHorizontalSize = 0; 1167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->displayAspectRatio.displayVerticalSize = 0; 1168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (panscan_payload) { 1168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->panScan.numWindows = panscan_payload->num_panscan_windows; 1168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel panscan_window = &panscan_payload->wnd[0]; 1168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) { 1168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->panScan.window[i].x = panscan_window->panscan_window_width; 1168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->panScan.window[i].y = panscan_window->panscan_window_height; 1168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset; 1169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset; 1169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel panscan_window++; 1169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fill_aspect_ratio_info(aspect_ratio_info, frame_info); 1169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra) 1169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL; 1170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE; 1170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef; 1170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); 1170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)(void *)extra->data; 1170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *portDefn = m_port_def; 1170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u " 1170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "stride = %u sliceheight = %u",(unsigned int)portDefn->format.video.nFrameHeight, 1171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nFrameWidth, 1171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nStride, 1171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->format.video.nSliceHeight); 1171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload) 1171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack; 1171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (FRAME_PACK_SIZE*sizeof(OMX_U32) != sizeof(struct msm_vidc_s3d_frame_packing_payload)) { 1172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("frame packing size mismatch"); 1172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_FRAMEPACK_EXTRADATA_SIZE; 1172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement; 1172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT); 1172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data; 1172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framepack->nSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT); 1173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framepack->nVersion.nVersion = OMX_SPEC_VERSION; 1173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framepack->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&framepack->id, s3d_frame_packing_payload, 1173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(struct msm_vidc_s3d_frame_packing_payload)); 1173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&m_frame_pack_arrangement, framepack, 1173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT)); 1173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_frame_qp_payload *qp_payload) 1174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_QP * qp = NULL; 1174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!qp_payload) { 1174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("QP payload is NULL"); 1174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_QP_EXTRADATA_SIZE; 1174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataQP; 1175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_QP); 1175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data; 1175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qp->nQP = qp_payload->frame_qp; 1175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_frame_bits_info_payload *bits_payload) 1175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_BITS_INFO * bits = NULL; 1176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!bits_payload) { 1176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("bits info payload is NULL"); 1176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_BITSINFO_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_ExtraDataInputBitsInfo; 1176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_BITS_INFO); 1177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bits = (OMX_QCOM_EXTRADATA_BITS_INFO*)(void *)extra->data; 1177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bits->frame_bits = bits_payload->frame_bits; 1177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bits->header_bits = bits_payload->header_bits; 1177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OTHER_EXTRADATATYPE *p_user) 1177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int userdata_size = 0; 1178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_stream_userdata_payload *userdata_payload = NULL; 1178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel userdata_payload = 1178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (struct msm_vidc_stream_userdata_payload *)(void *)p_user->data; 1178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel userdata_size = p_user->nDataSize; 1178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_USERDATA_EXTRADATA_SIZE + userdata_size; 1178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData; 1178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = userdata_size; 1178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra->nDataSize && (p_user->nDataSize >= extra->nDataSize)) 1179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(extra->data, p_user->data, extra->nDataSize); 1179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra) 1179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!client_extradata) { 1179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE); 1180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = OMX_ExtraDataNone; 1180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = 0; 1180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->data[0] = 0; 1180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_vqzip_extradata(OMX_OTHER_EXTRADATATYPE *extra, 1180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_vqzip_sei_payload *vqzip_payload) 1181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_VQZIPSEI *vq = NULL; 1181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nSize = OMX_VQZIPSEI_EXTRADATA_SIZE + vqzip_payload->size; 1181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nVersion.nVersion = OMX_SPEC_VERSION; 1181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI; 1181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_VQZIPSEI) + vqzip_payload->size; 1181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data; 1182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vq->nSize = vqzip_payload->size; 1182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(vq->data, vqzip_payload->data, vqzip_payload->size); 1182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel print_debug_extradata(extra); 1182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_desc_buffer(OMX_U32 index) 1182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index >= drv_ctx.ip_buf.actualcount) { 1183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found"); 1183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_desc_buffer_ptr == NULL) { 1183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_desc_buffer_ptr = (desc_buffer_hdr*) \ 1183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(desc_buffer_hdr)), 1183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 1183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_desc_buffer_ptr == NULL) { 1183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed "); 1183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8)); 1184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_desc_buffer_ptr[index].buf_addr == NULL) { 1184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("desc buffer Allocation failed "); 1184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset) 1185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inserting address offset (%u) at idx (%u)", (unsigned int)address_offset,(unsigned int)m_demux_entries); 1185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_demux_entries < 8192) { 1185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_offsets[m_demux_entries++] = address_offset; 1185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr) 1186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 bytes_to_parse = buf_hdr->nFilledLen; 1186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset; 1186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 index = 0; 1186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_entries = 0; 1186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (index < bytes_to_parse) { 1187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 1187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) || 1187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((buf[index] == 0x00) && (buf[index+1] == 0x00) && 1187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (buf[index+2] == 0x01)) ) { 1187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Found start code, insert address offset 1187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel insert_demux_addr_offset(index); 1187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf[index+2] == 0x01) // 3 byte start code 1187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index += 3; 1187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else //4 byte start code 1187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index += 4; 1188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 1188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index++; 1188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Extracted (%u) demux entry offsets", (unsigned int)m_demux_entries); 1188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr) 1188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //fix this, handle 3 byte start code, vc1 terminator entry 1189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *p_demux_data = NULL; 1189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 desc_data = 0; 1189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 start_addr = 0; 1189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 nal_size = 0; 1189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 suffix_byte = 0; 1189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 demux_index = 0; 1189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 buffer_index = 0; 1189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_desc_buffer_ptr == NULL) { 1189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries."); 1190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 1190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_index > drv_ctx.ip_buf.actualcount) { 1190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%u)", (unsigned int)buffer_index); 1190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr; 1191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( ((OMX_U8*)p_demux_data == NULL) || 1191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) { 1191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries."); 1191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; demux_index < m_demux_entries; demux_index++) { 1191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel desc_data = 0; 1191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel start_addr = m_demux_offsets[demux_index]; 1191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) { 1192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3]; 1192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4]; 1192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (demux_index < (m_demux_entries - 1)) { 1192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2; 1192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2; 1192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Start_addr(0x%x), suffix_byte(0x%x),nal_size(%u),demux_index(%u)", 1193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)start_addr, 1193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)suffix_byte, 1193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)nal_size, 1193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)demux_index); 1193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel desc_data = (start_addr >> 3) << 1; 1193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel desc_data |= (start_addr & 7) << 21; 1193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel desc_data |= suffix_byte << 24; 1193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 1193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32)); 1194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 1194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 1194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_demux_data += 16; 1194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_type_parse == CODEC_TYPE_VC1) { 1194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("VC1 terminator entry"); 1194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel desc_data = 0; 1194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel desc_data = 0x82 << 24; 1194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(p_demux_data, &desc_data, sizeof(OMX_U32)); 1195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(p_demux_data + 4, 0, sizeof(OMX_U32)); 1195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(p_demux_data + 8, 0, sizeof(OMX_U32)); 1195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(p_demux_data + 12, 0, sizeof(OMX_U32)); 1195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_demux_data += 16; 1195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_entries++; 1195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Add zero word to indicate end of descriptors 1195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(p_demux_data, 0, sizeof(OMX_U32)); 1195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32); 1196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("desc table data size=%u", (unsigned int)m_desc_buffer_ptr[buffer_index].desc_data_size); 1196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) ); 1196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_demux_entries = 0; 1196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Demux table complete!"); 1196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::request_perf_level(enum vidc_perf_level perf_level) 1196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 1197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char property_value[PROPERTY_VALUE_MAX] = {0}; 1197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.debug.turbo", property_value, "0"); 1197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&control, 0, sizeof(v4l2_control)); 1197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL; 1197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (perf_level) { 1197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VIDC_NOMINAL: 1197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(property_value)) 1197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO; 1198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 1198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL; 1198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VIDC_TURBO: 1198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO; 1198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Requested PERF level not supported"); 1198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((current_perf_level == (OMX_U32)control.value) && !in_reconfig) 1199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("changing performance level to %d", control.value); 1199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) { 1199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel current_perf_level = control.value; 1199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set PERF level"); 1199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf() 1200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enabled = false; 1200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx = NULL; 1200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel init_members(); 1200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ColorFormat = OMX_COLOR_FormatMax; 1200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_format = YCbCr420P; 1200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_c2d_width = 0; 1200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_c2d_height = 0; 1201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client) 1201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx = reinterpret_cast<omx_vdec*>(client); 1201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::allocate_color_convert_buf::init_members() 1201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocated_count = 0; 1202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size_req = 0; 1202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_alignment_req = 0; 1202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_c2d_width = m_c2d_height = 0; 1202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_platform_list_client,0,sizeof(m_platform_list_client)); 1202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_platform_entry_client,0,sizeof(m_platform_entry_client)); 1202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_pmem_info_client,0,sizeof(m_pmem_info_client)); 1202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client)); 1202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 1202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(op_buf_ion_info,0,sizeof(m_platform_entry_client)); 1202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (int i = 0; i < MAX_COUNT; i++) 1203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd[i] = -1; 1203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() 1203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.destroy(); 1203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::update_buffer_req() 1204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 1204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int src_size = 0, destination_size = 0; 120432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel unsigned int height, width; 120442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel struct v4l2_format fmt; 1204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COLOR_FORMATTYPE drv_color_format; 120462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 1204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx) { 1204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid client in color convert"); 1204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 1205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) { 1205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("No color conversion required"); 1205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 1205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&omx->c_lock); 1205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 120572601808ee2992a94c325d05e4065aba60b01840bThierry Strudel memset(&fmt, 0x0, sizeof(struct v4l2_format)); 120582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 120592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fmt.fmt.pix_mp.pixelformat = omx->capture_capability; 120602601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt); 120612601808ee2992a94c325d05e4065aba60b01840bThierry Strudel width = fmt.fmt.pix_mp.width; 120622601808ee2992a94c325d05e4065aba60b01840bThierry Strudel height = fmt.fmt.pix_mp.height; 120632601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 120642601808ee2992a94c325d05e4065aba60b01840bThierry Strudel bool resolution_upgrade = (height > m_c2d_height || 120652601808ee2992a94c325d05e4065aba60b01840bThierry Strudel width > m_c2d_width); 1206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (resolution_upgrade) { 1206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // resolution upgraded ? ensure we are yet to allocate; 1206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // failing which, c2d buffers will never be reallocated and bad things will happen 1206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocated_count > 0) { 1207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Cannot change C2D buffer requirements with %d active allocations", 1207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocated_count); 1207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto fail_update_buf_req; 1207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 && 1207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ColorFormat != OMX_COLOR_FormatYUV420Planar) { 1207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion"); 1208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto fail_update_buf_req; 1208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.close(); 120842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel status = c2d.open(height, 120852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel width, 1208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NV12_128m,dest_format); 1208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status) { 1208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = c2d.get_buffer_size(C2D_INPUT,src_size); 1208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status) 1209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = c2d.get_buffer_size(C2D_OUTPUT,destination_size); 1209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status) { 1209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size || 1209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !destination_size) { 1209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d" 1209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "driver size %u destination size %d", 1209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel src_size, (unsigned int)omx->drv_ctx.op_buf.buffer_size, 1209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel destination_size); 1209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.close(); 1210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size_req = 0; 1210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // TODO: make this fatal. Driver is not supposed to quote size 1210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // smaller than what C2D needs !! 1210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size_req = destination_size; 121062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_c2d_height = height; 121072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_c2d_width = width; 1210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelfail_update_buf_req: 1211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->c_lock); 1211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 1211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::set_color_format( 1211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COLOR_FORMATTYPE dest_color_format) 1211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 12118b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool status = true, drv_colorformat_c2d_enable = false; 12119b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bool dest_color_format_c2d_enable = false; 12120b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel OMX_COLOR_FORMATTYPE drv_color_format = OMX_COLOR_FormatUnused; 1212111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx) { 1212211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid client in color convert"); 1212311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 1212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&omx->c_lock); 1212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) 1212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) 1212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_color_format = (OMX_COLOR_FORMATTYPE) 1212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView; 1213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 1213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_color_format = (OMX_COLOR_FORMATTYPE) 1213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 1213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) { 1213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_color_format = (OMX_COLOR_FORMATTYPE) 1213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed; 12136b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) { 12137b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel drv_color_format = (OMX_COLOR_FORMATTYPE) 12138b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed; 1213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Incorrect color format"); 1214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 12143b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel drv_colorformat_c2d_enable = (drv_color_format != dest_color_format) && 12144b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel (drv_color_format != (OMX_COLOR_FORMATTYPE) 12145b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView) && 12146b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel (drv_color_format != (OMX_COLOR_FORMATTYPE) 12147b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) && 12148b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel (drv_color_format != (OMX_COLOR_FORMATTYPE) 12149b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed); 12150b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 12151b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel dest_color_format_c2d_enable = (dest_color_format != (OMX_COLOR_FORMATTYPE) 12152b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) && 12153b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel (dest_color_format != (OMX_COLOR_FORMATTYPE) 12154b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed); 12155b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 12156b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (status && drv_colorformat_c2d_enable && dest_color_format_c2d_enable) { 1215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Enabling C2D"); 1215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((dest_color_format != OMX_COLOR_FormatYUV420Planar) && 1215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (dest_color_format != OMX_COLOR_FormatYUV420SemiPlanar)) { 1216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unsupported color format for c2d"); 1216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ColorFormat = dest_color_format; 1216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_format = (dest_color_format == OMX_COLOR_FormatYUV420Planar) ? 1216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel YCbCr420P : YCbCr420SP; 1216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enabled) 1216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.destroy(); 1216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enabled = false; 1216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!c2d.init()) { 1217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("open failed for c2d"); 1217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 1217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enabled = true; 1217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enabled) 1217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.destroy(); 1217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enabled = false; 1217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->c_lock); 1218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 1218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr() 1218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx) { 1218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 1218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 1218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) 1219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return omx->m_out_mem_ptr; 1219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return m_out_mem_ptr_client; 1219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr 1219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(OMX_BUFFERHEADERTYPE *bufadd) 1219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx) { 1219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 1220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 1220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) 1220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bufadd; 1220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned index = 0; 1220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufadd - omx->m_out_mem_ptr; 1220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < omx->drv_ctx.op_buf.actualcount) { 1220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS); 1220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp; 1221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status; 1221111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) { 1221211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&omx->c_lock); 1221311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cache_clean_buffer(index); 1221411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd, 1221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer, pmem_fd[index], 1221611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_baseaddress[index], pmem_baseaddress[index]); 1221711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!status) { 1221811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed color conversion %d", status); 1221911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[index].nFilledLen = 0; 1222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->c_lock); 1222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return &m_out_mem_ptr_client[index]; 1222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int filledLen = 0; 1222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.get_output_filled_length(filledLen); 1222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[index].nFilledLen = filledLen; 1222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cache_clean_invalidate_buffer(index); 1222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->c_lock); 1222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 1223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[index].nFilledLen = 0; 1223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return &m_out_mem_ptr_client[index]; 1223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr"); 1223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 1223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr 1223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(OMX_BUFFERHEADERTYPE *bufadd) 1223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx) { 1224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid param get_buf_hdr"); 1224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 1224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) 1224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bufadd; 1224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned index = 0; 1224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufadd - m_out_mem_ptr_client; 1224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < omx->drv_ctx.op_buf.actualcount) { 1224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return &omx->m_out_mem_ptr[index]; 1225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr"); 1225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 1225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool omx_vdec::allocate_color_convert_buf::get_buffer_req 1225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(unsigned int &buffer_size) 1225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 1225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&omx->c_lock); 1225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) 1226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size = omx->drv_ctx.op_buf.buffer_size; 1226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 1226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) { 1226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get buffer size failed"); 1226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto fail_get_buffer_size; 1226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelfail_get_buffer_size: 1226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->c_lock); 1227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 1227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::set_buffer_req( 1227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 buffer_size, OMX_U32 actual_count) { 1227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 expectedSize = enabled ? buffer_size_req : omx->drv_ctx.op_buf.buffer_size; 1227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_size < expectedSize) { 1227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OP Requirements: Client size(%u) insufficient v/s requested(%u)", 1227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size, expectedSize); 1228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (actual_count < omx->drv_ctx.op_buf.actualcount) { 1228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OP Requirements: Client count(%u) insufficient v/s requested(%u)", 1228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel actual_count, omx->drv_ctx.op_buf.actualcount); 1228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool reqs_updated = false; 1228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enabled) { 1229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // disallow changing buffer size/count while we have active allocated buffers 1229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocated_count > 0) { 1229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Cannot change C2D buffer size from %u to %u with %d active allocations", 1229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size_req, buffer_size, allocated_count); 1229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 1229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size_req = buffer_size; 1229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_size > omx->drv_ctx.op_buf.buffer_size) { 1230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.op_buf.buffer_size = buffer_size; 1230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reqs_updated = true; 1230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (actual_count > omx->drv_ctx.op_buf.actualcount) { 1230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.op_buf.actualcount = actual_count; 1230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reqs_updated = true; 1230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (reqs_updated) { 1231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.extradata_info.count = omx->drv_ctx.op_buf.actualcount; 1231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.extradata_info.size = omx->drv_ctx.extradata_info.count * 1231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.extradata_info.buffer_size; 1231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return omx->set_buffer_req(&(omx->drv_ctx.op_buf)); 1231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer( 1232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufhdr) 1232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = 0; 1232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) 1232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return omx->free_output_buffer(bufhdr); 1232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enabled && omx->is_component_secure()) 1232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!allocated_count || !bufhdr) { 1232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr); 1233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufhdr - m_out_mem_ptr_client; 1233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index >= omx->drv_ctx.op_buf.actualcount) { 1233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer"); 1233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_fd[index] >= 0) { 1233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(pmem_baseaddress[index], buffer_size_req); 1233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd[index]); 1234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd[index] = -1; 1234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 1234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->free_ion_memory(&op_buf_ion_info[index]); 1234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_heap_ptr[index].video_heap_ptr = NULL; 1234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocated_count > 0) 1234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocated_count--; 1234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 1234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocated_count = 0; 1235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!allocated_count) { 1235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&omx->c_lock); 1235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d.close(); 1235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel init_members(); 1235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->c_lock); 1235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return omx->free_output_buffer(&omx->m_out_mem_ptr[index]); 1235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp, 1236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes) 1236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) { 1236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes); 1236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enabled && omx->is_component_secure()) { 1236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d", 1236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->is_component_secure()); 1237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 1237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!bufferHdr || bytes > buffer_size_req) { 1237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr); 1237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("color_convert buffer_size_req %u bytes %u", 1237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)buffer_size_req, (unsigned int)bytes); 1237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocated_count >= omx->drv_ctx.op_buf.actualcount) { 1237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert"); 1238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL; 1238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr, 1238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel port,appData,omx->drv_ctx.op_buf.buffer_size); 1238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone || !temp_bufferHdr) { 1238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Buffer allocation failed color_convert"); 1238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((temp_bufferHdr - omx->m_out_mem_ptr) >= 1239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)omx->drv_ctx.op_buf.actualcount) { 1239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid header index %ld", 1239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (long int)(temp_bufferHdr - omx->m_out_mem_ptr)); 1239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 1239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int i = allocated_count; 1239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 1239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Allocate color-conversion buffers as cached to improve software-reading 1239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // performance of YUV (thumbnails). NOTE: These buffers will need an explicit 1239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // cache invalidation. 1240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory( 1240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_size_req,buffer_alignment_req, 1240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data, 1240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ION_FLAG_CACHED); 1240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd; 1240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (op_buf_ion_info[i].ion_device_fd < 0) { 1240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert"); 1240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req, 1241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0); 1241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_baseaddress[i] == MAP_FAILED) { 1241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req); 1241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd[i]); 1241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->free_ion_memory(&op_buf_ion_info[i]); 1241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 1241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_heap_ptr[i].video_heap_ptr = new VideoHeap ( 1241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel op_buf_ion_info[i].ion_device_fd,buffer_size_req, 1242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]); 1242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info_client[i].pmem_fd = (unsigned long)m_heap_ptr[i].video_heap_ptr.get(); 1242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info_client[i].offset = 0; 1242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i]; 1242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM; 1242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list_client[i].nEntries = 1; 1242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list_client[i].entryList = &m_platform_entry_client[i]; 1242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].pOutputPortPrivate = NULL; 1242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].nAllocLen = buffer_size_req; 1243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].nFilledLen = 0; 1243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].nFlags = 0; 1243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 1243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE); 1243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION; 1243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i]; 1243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i]; 1243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr_client[i].pAppPrivate = appData; 1243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = &m_out_mem_ptr_client[i]; 1243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("IL client buffer header %p", *bufferHdr); 1244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocated_count++; 1244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::is_component_secure() 1244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return secure_mode; 1244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format) 1245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 1245211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) { 1245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) { 1245411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) 1245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_color_format = (OMX_COLOR_FORMATTYPE) 1245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView; 1245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 1245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 1245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC){ 1246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed; 12461b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC){ 12462b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed; 1246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 1246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ColorFormat == OMX_COLOR_FormatYUV420Planar || 1246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) { 1246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_color_format = ColorFormat; 1246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 1247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 1247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 1247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::cache_ops( 1247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index, unsigned int cmd) 1247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) { 1247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!omx || index >= omx->drv_ctx.op_buf.actualcount) { 1248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: Invalid param", __func__); 1248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_flush_data flush_data; 1248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_custom_data custom_data; 1248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&flush_data, 0x0, sizeof(flush_data)); 1249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&custom_data, 0x0, sizeof(custom_data)); 1249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flush_data.vaddr = pmem_baseaddress[index]; 1249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flush_data.fd = op_buf_ion_info[index].fd_ion_data.fd; 1249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flush_data.handle = op_buf_ion_info[index].fd_ion_data.handle; 1249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flush_data.length = buffer_size_req; 1249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel custom_data.cmd = cmd; 1249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel custom_data.arg = (unsigned long)&flush_data; 1249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Cache %s: fd=%d handle=%d va=%p size=%d", 1250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate", 1250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flush_data.fd, flush_data.handle, flush_data.vaddr, 1250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flush_data.length); 1250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret = ioctl(op_buf_ion_info[index].ion_device_fd, ION_IOC_CUSTOM, &custom_data); 1250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret < 0) { 1250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Cache %s failed: %s\n", 1250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate", 1250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strerror(errno)); 1250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 1251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::buf_ref_add(int nPortIndex) 1251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long i = 0; 1251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool buf_present = false; 1251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel long fd = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 1251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 offset = drv_ctx.ptr_outputbuffer[nPortIndex].offset; 1252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dynamic_buf_mode || !out_dynamic_list) { 1252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 1252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.op_buf.actualcount; i++) { 1252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //check the buffer fd, offset, uv addr with list contents 1252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //If present increment reference. 1252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((out_dynamic_list[i].fd == fd) && 1253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (out_dynamic_list[i].offset == offset)) { 1253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("buf_ref_add: [ALREADY PRESENT] fd = %u ref_count = %u", 1253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count); 1253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 1253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = out_dynamic_list[i].buffaddr; 1253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_present = true; 1253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!buf_present) { 1254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.op_buf.actualcount; i++) { 1254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //search for a entry to insert details of the new buffer 1254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (out_dynamic_list[i].dup_fd < 0) { 1254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].fd = fd; 1254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].offset = offset; 1254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].dup_fd = dup(fd); 1254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].ref_count++; 1254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("buf_ref_add: [ADDED] fd = %u ref_count = %u", 1254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count); 1255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode) { 1255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = 1255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len, 1255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, 1255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd, 0); 1255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //mmap returns (void *)-1 on failure and sets error code in errno. 1255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr == MAP_FAILED) { 1255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("buf_ref_add: mmap failed - errno: %d", errno); 1255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = NULL; 1256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].buffaddr = drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr; 1256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].mapped_size = drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len; 1256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("mmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size); 1256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 1257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::buf_ref_remove() 1257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long i = 0; 1257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dynamic_buf_mode || !out_dynamic_list) { 1257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 1258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.op_buf.actualcount; i++) { 1258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!secure_mode && out_dynamic_list[i].buffaddr && out_dynamic_list[i].mapped_size) { 1258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("munmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size); 1258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(out_dynamic_list[i].buffaddr, 1258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].mapped_size); 1258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("buf_ref_remove: [REMOVED] fd = %u ref_count = %u", 1259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count); 1259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(out_dynamic_list[i].dup_fd); 1259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list[i].dup_fd = -1; 1259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 1259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (out_dynamic_list) { 1259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(out_dynamic_list); 1259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel out_dynamic_list = NULL; 1259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 1260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::send_codec_config() { 1260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_config_flag) { 1260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1 = 0; // Parameter - 1 1260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2 = 0; // Parameter - 2 1260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident = 0; 1260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 1260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("\n Check Queue for codec_config buffer \n"); 1261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_etb_q.m_size) { 1261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.pop_entry(&p1,&p2,&ident); 1261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) { 1261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 1261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\ 1261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 1261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure"); 1261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error(); 1261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 1262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 1262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_ETB) { 1262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { 1262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 1262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 1262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure"); 1262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 1262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers++; 12632b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 1263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 1263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 1263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 1263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_EBD) { 1263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p", 1263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p1); 1264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 1264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 1264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 1264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_control::perf_control() 1264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lib = NULL; 1265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_handle = 0; 1265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock_acquire = NULL; 1265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock_release = NULL; 1265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_control::~perf_control() 1265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_handle != 0 && m_perf_lock_release) { 1265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("NOTE2: release perf lock"); 1266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock_release(m_perf_handle); 1266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_lib) { 1266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlclose(m_perf_lib); 1266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct omx_vdec::perf_control::mpctl_stats omx_vdec::perf_control::mpctl_obj = {0, 0, 0}; 1266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_lock omx_vdec::perf_control::m_perf_lock; 1267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::perf_control::send_hint_to_mpctl(bool state) 1267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (load_lib() == false) { 1267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock.lock(); 1267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 0x4401 maps to video decode playback hint 1267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * in perflock, enum number is 44 and state 1267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * being sent on perflock acquire is 01 (true) 1268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 1268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int arg = 0x4401; 1268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (state == true) { 1268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mpctl_obj.vid_inst_count++; 1268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (state == false) { 1268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mpctl_obj.vid_inst_count--; 1268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_lock_acquire && mpctl_obj.vid_inst_count == 1 && mpctl_obj.vid_acquired == false) { 1269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mpctl_obj.vid_disp_handle = m_perf_lock_acquire(0, 0, &arg, sizeof(arg) / sizeof(int)); 1269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mpctl_obj.vid_acquired = true; 1269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("Video slvp perflock acquired"); 1269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_perf_lock_release && (mpctl_obj.vid_inst_count == 0 || mpctl_obj.vid_inst_count > 1) && mpctl_obj.vid_acquired == true) { 1269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock_release(mpctl_obj.vid_disp_handle); 1269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mpctl_obj.vid_acquired = false; 1269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("Video slvp perflock released"); 1269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock.unlock(); 1269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::perf_control::request_cores(int frame_duration_us) 1270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frame_duration_us > MIN_FRAME_DURATION_FOR_PERF_REQUEST_US) { 1270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool retVal = load_lib(); 1270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retVal && m_perf_lock_acquire && m_perf_handle == 0) { 1270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int arg = 0x700 /*base value*/ + 2 /*cores*/; 1270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_handle = m_perf_lock_acquire(m_perf_handle, 0, &arg, sizeof(arg)/sizeof(int)); 1271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_handle) { 1271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("perf lock acquired"); 1271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::perf_control::load_lib() 1271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char perf_lib_path[PROPERTY_VALUE_MAX] = {0}; 1271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_lib) 1272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 1272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((property_get("ro.vendor.extension_library", perf_lib_path, NULL) <= 0)) { 1272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("vendor library not set in ro.vendor.extension_library"); 1272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto handle_err; 1272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_perf_lib = dlopen(perf_lib_path, RTLD_NOW)) == NULL) { 1272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to open %s : %s",perf_lib_path, dlerror()); 1272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto handle_err; 1273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock_acquire = (perf_lock_acquire_t)dlsym(m_perf_lib, "perf_lock_acq"); 1273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_lock_acquire == NULL) { 1273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_acq"); 1273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto handle_err; 1273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lock_release = (perf_lock_release_t)dlsym(m_perf_lib, "perf_lock_rel"); 1273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_lock_release == NULL) { 1273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_rel"); 1273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto handle_err; 1274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 1274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelhandle_err: 1274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_perf_lib) { 1274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlclose(m_perf_lib); 1274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_perf_lib = NULL; 1274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 1275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::enable_adaptive_playback(unsigned long nMaxFrameWidth, 1275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long nMaxFrameHeight) 1275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 1275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 1275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret = 0; 1275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long min_res_buf_count = 0; 1275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_smoothstreaming(); 1276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 1276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to enable Adaptive Playback on driver"); 1276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Enabling Adaptive playback for %lu x %lu", 1276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nMaxFrameWidth, 1276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nMaxFrameHeight); 1276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_mode = true; 1277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_width = nMaxFrameWidth; 1277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_height = nMaxFrameHeight; 1277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Get upper limit buffer count for min supported resolution 1277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 1277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_decoder_capability.min_height; 1277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_decoder_capability.min_width; 1277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 1277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 1278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Resolution failed for HxW = %ux%u", 1278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_height, 1278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_decoder_capability.min_width); 1278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 1278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 1278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 1279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("failed to get_buffer_req"); 1279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_res_buf_count = drv_ctx.op_buf.mincount; 1279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("enable adaptive - upper limit buffer count = %lu for HxW %ux%u", 1279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_res_buf_count, m_decoder_capability.min_height, m_decoder_capability.min_width); 1279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12798fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nLeft = 0; 12799fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nTop = 0; 12800fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nWidth = m_smoothstreaming_width; 12801fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_extradata_info.output_crop_rect.nHeight = m_smoothstreaming_height; 12802fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel 1280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel update_resolution(m_smoothstreaming_width, m_smoothstreaming_height, 1280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_smoothstreaming_width, m_smoothstreaming_height); 1280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = is_video_session_supported(); 1280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 1280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("video session is not supported"); 1280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Get upper limit buffer size for max smooth streaming resolution set 1281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height; 1281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width; 1281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 1281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt); 1281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 1281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Resolution failed for adaptive playback"); 1281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 1282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 1282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 1282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("failed to get_buffer_req!!"); 1282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("enable adaptive - upper limit buffer size = %u", 1282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)drv_ctx.op_buf.buffer_size); 1282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.mincount = min_res_buf_count; 1283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount = min_res_buf_count; 1283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size = drv_ctx.op_buf.buffer_size; 1283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_buffer_req(&drv_ctx.op_buf); 1283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 1283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("failed to set_buffer_req"); 1283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 1284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) { 1284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("failed to get_buffer_req!!!"); 1284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("adaptive playback enabled, buf count = %u bufsize = %u", 1284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.mincount, (unsigned int)drv_ctx.op_buf.buffer_size); 1284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 1284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//static 1285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::describeColorFormat(OMX_PTR pParam) { 1285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef FLEXYUV_SUPPORTED 1285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 1285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 1285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam == NULL) { 1285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("describeColorFormat: invalid params"); 1285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 1285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DescribeColorFormatParams *params = (DescribeColorFormatParams*)pParam; 1286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MediaImage *img = &(params->sMediaImage); 1286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch(params->eColorFormat) { 1286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m: 1286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 1286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mType = MediaImage::MEDIA_IMAGE_TYPE_YUV; 1286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mNumPlanes = 3; 1286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // mWidth and mHeight represent the W x H of the largest plane 1287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // In our case, this happens to be the Stride x Scanlines of Y plane 1287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mWidth = params->nFrameWidth; 1287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mHeight = params->nFrameHeight; 1287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size_t planeWidth = VENUS_Y_STRIDE(COLOR_FMT_NV12, params->nFrameWidth); 1287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size_t planeHeight = VENUS_Y_SCANLINES(COLOR_FMT_NV12, params->nFrameHeight); 1287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mBitDepth = 8; 1287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Plane 0 (Y) 1287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::Y].mOffset = 0; 1287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::Y].mColInc = 1; 1287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::Y].mRowInc = planeWidth; //same as stride 1288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::Y].mHorizSubsampling = 1; 1288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::Y].mVertSubsampling = 1; 1288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Plane 1 (U) 1288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::U].mOffset = planeWidth * planeHeight; 1288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::U].mColInc = 2; //interleaved UV 1288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::U].mRowInc = 1288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth); 1288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::U].mHorizSubsampling = 2; 1288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::U].mVertSubsampling = 2; 1288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Plane 2 (V) 1289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::V].mOffset = planeWidth * planeHeight + 1; 1289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::V].mColInc = 2; //interleaved UV 1289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::V].mRowInc = 1289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth); 1289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::V].mHorizSubsampling = 2; 1289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mPlane[MediaImage::V].mVertSubsampling = 2; 1289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COLOR_FormatYUV420Planar: 1290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COLOR_FormatYUV420SemiPlanar: 1290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // We need not describe the standard OMX linear formats as these are 1290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // understood by client. Fail this deliberately to let client fill-in 1290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 1290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Rest all formats which are non-linear cannot be described 1290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("color-format %x is not flexible", params->eColorFormat); 1290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel img->mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 1290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel }; 1291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("NOTE: Describe color format : %x", params->eColorFormat); 1291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" FrameWidth x FrameHeight : %d x %d", params->nFrameWidth, params->nFrameHeight); 1291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" YWidth x YHeight : %d x %d", img->mWidth, img->mHeight); 1291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (size_t i = 0; i < img->mNumPlanes; ++i) { 1291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Plane[%zu] : offset=%d / xStep=%d / yStep = %d", 1291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel i, img->mPlane[i].mOffset, img->mPlane[i].mColInc, img->mPlane[i].mRowInc); 1291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 1292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //FLEXYUV_SUPPORTED 1292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 1292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::prefetchNewBuffers() { 1292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_decoder_cmd dec; 1292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t prefetch_count; 1292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t prefetch_size; 1292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t want_size; 1292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t have_size; 1293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int color_fmt, rc; 1293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t new_calculated_size; 1293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t new_buffer_size; 1293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t new_buffer_count; 1293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t old_buffer_size; 1293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t old_buffer_count; 1293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&dec, 0 , sizeof(dec)); 1293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Old size : %zu, count : %d, width : %u, height : %u\n", 1293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size, drv_ctx.op_buf.actualcount, 1294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_width, 1294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution.frame_height); 1294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec.cmd = V4L2_DEC_QCOM_CMD_RECONFIG_HINT; 1294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) { 1294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Buffer info cmd failed : %d\n", errno); 1294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 1294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("From driver, new size is %d, count is %d\n", 1294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dec.raw.data[0], dec.raw.data[1]); 1294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((int)drv_ctx.output_format) { 1295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_YUV_FORMAT_NV12: 1295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_fmt = COLOR_FMT_NV12; 1295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 1295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDEC_YUV_FORMAT_NV12_UBWC: 1295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_fmt = COLOR_FMT_NV12_UBWC; 1295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 12957b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel case VDEC_YUV_FORMAT_NV12_TP10_UBWC: 12958b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel color_fmt = COLOR_FMT_NV12_BPP10_UBWC; 12959b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel break; 1296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 1296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_fmt = -1; 1296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Color format : %x not supported for secure memory prefetching\n", drv_ctx.output_format); 1296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_calculated_size = VENUS_BUFFER_SIZE(color_fmt, m_reconfig_width, m_reconfig_height); 1296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("New calculated size for width : %d, height : %d, is %d\n", 1296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_reconfig_width, m_reconfig_height, new_calculated_size); 1296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_buffer_size = (dec.raw.data[0] > new_calculated_size) ? dec.raw.data[0] : new_calculated_size; 1297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_buffer_count = dec.raw.data[1]; 1297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel old_buffer_size = drv_ctx.op_buf.buffer_size; 1297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel old_buffer_count = drv_ctx.op_buf.actualcount; 1297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_buffer_count = old_buffer_count > new_buffer_count ? old_buffer_count : new_buffer_count; 1297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prefetch_count = new_buffer_count; 1297711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prefetch_size = new_buffer_size - old_buffer_size; 1297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel want_size = new_buffer_size * new_buffer_count; 1297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel have_size = old_buffer_size * old_buffer_count; 1298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (want_size > have_size) { 1298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Want: %d, have : %d\n", want_size, have_size); 1298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("prefetch_count: %d, prefetch_size : %d\n", prefetch_count, prefetch_size); 1298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ion_fd = open(MEM_DEVICE, O_RDONLY); 1298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ion_fd < 0) { 1298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Ion fd open failed : %d\n", ion_fd); 1298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 1298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_custom_data *custom_data = (struct ion_custom_data*) malloc(sizeof(*custom_data)); 1299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_prefetch_data *prefetch_data = (struct ion_prefetch_data*) malloc(sizeof(*prefetch_data)); 1299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_prefetch_regions *regions = (struct ion_prefetch_regions*) malloc(sizeof(*regions)); 1299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size_t *sizes = (size_t*) malloc(sizeof(size_t) * prefetch_count); 1299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (custom_data == NULL || prefetch_data == NULL || regions == NULL || sizes == NULL) { 1299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("prefetch data allocation failed"); 1299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto prefetch_exit; 1299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (uint32_t i = 0; i < prefetch_count; i++) { 1300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizes[i] = prefetch_size; 1300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel regions[0].nr_sizes = prefetch_count; 1300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel regions[0].sizes = sizes; 1300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel regions[0].vmid = ION_FLAG_CP_PIXEL; 1300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prefetch_data->nr_regions = 1; 1301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prefetch_data->regions = regions; 1301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prefetch_data->heap_id = ION_HEAP(ION_SECURE_HEAP_ID); 1301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel custom_data->cmd = ION_IOC_PREFETCH; 1301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel custom_data->arg = (unsigned long )prefetch_data; 1301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(ion_fd, ION_IOC_CUSTOM, custom_data); 1301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 1301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Custom prefetch ioctl failed rc : %d, errno : %d\n", rc, errno); 1301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1302111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelprefetch_exit: 1302211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(ion_fd); 1302311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(sizes); 1302411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(regions); 1302511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(prefetch_data); 1302611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(custom_data); 1302711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1302811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 13029