111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*--------------------------------------------------------------------------------------- 211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCopyright (c) 2013-2015, 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*//** @file omx_vdpp.cpp 3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel This module contains the implementation of the OpenMAX video post-processing component. 3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel*//*========================================================================*/ 3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel////////////////////////////////////////////////////////////////////////////// 3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Include Files 4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel////////////////////////////////////////////////////////////////////////////// 4111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define LOG_NDEBUG 0 4211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <string.h> 4311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <pthread.h> 4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/prctl.h> 4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <stdlib.h> 4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <unistd.h> 4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <errno.h> 4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "omx_vdpp.h" 4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <fcntl.h> 5011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <limits.h> 5111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/msm_media_info.h> 5211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef _ANDROID_ 5411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/ioctl.h> 5511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/mman.h> 5611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //_ANDROID_ 5711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <cutils/properties.h> 6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#undef USE_EGL_IMAGE_GPU 6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <gralloc_priv.h> 6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef INPUT_BUFFER_LOG 6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint inputBufferFile; 6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelchar inputfilename[] = "/sdcard/input-bitstream"; 7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_BUFFER_LOG 7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint outputBufferFile; 7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelchar outputfilename[] = "/sdcard/output.yuv"; 7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG 7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFILE *outputExtradataFile; 7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelchar ouputextradatafilename[] = "/data/extradata"; 7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <stdarg.h> 8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/stat.h> 8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <dirent.h> 8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extern "C"{ 8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel #include<utils/Log.h> 8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif//_ANDROID_ 8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define POLL_TIMEOUT 0x7fffffff //10000// 9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_DEVICE "/dev/ion" 9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_HEAP_ID ION_CP_MM_HEAP_ID 9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_FPS 30 9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX_INPUT_ERROR DEFAULT_FPS 9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX_SUPPORTED_FPS 120 9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_4K 0x1000 9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } } 10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); } 10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EXTRADATA_IDX(__num_planes) (__num_planes - 1) 10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 10411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA) 10511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 10611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 10711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* async_message_thread (void *input) 10811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 10911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 11011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 11111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *buffer; 11211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 11311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pollfd pfd[2]; 11411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer v4l2_buf; 11511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event dqevent; 11611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp *omx = reinterpret_cast<omx_vdpp*>(input); 11711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfd[0].events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 11811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfd[0].fd = omx->drv_ctx.video_vpu_fd; 11911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfd[1].events = POLLIN | POLLPRI | POLLERR; 12011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfd[1].fd = omx->m_ctrl_in; 12111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp: Async thread start\n"); 12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prctl(PR_SET_NAME, (unsigned long)"VdppCallBackThread", 0, 0, 0); 12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (1) 12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 12711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = poll(pfd, 2, POLL_TIMEOUT); 12811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!rc) { 13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Poll timedout\n"); 13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; // no input buffers EOS reached 13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (rc < 0) { 13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error while polling: %d\n", rc); 13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("async_message_thread 1 POLL_TIMEOUT = 0x%x", POLL_TIMEOUT); 13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pfd[1].revents & (POLLIN | POLLPRI | POLLERR)) 13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("pipe event, exit async thread"); 14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 14411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // output buffer ready for fbd 14511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pfd[0].revents & POLLIN) || (pfd[0].revents & POLLRDNORM)) { 14611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("async_message_thread 1\n"); 14711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_msginfo vdpp_msg; 14811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 14911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.memory = V4L2_MEMORY_USERPTR; 15011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.length = omx->drv_ctx.output_num_planes; 15111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.m.planes = plane; 15211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while(!ioctl(pfd[0].fd, VIDIOC_DQBUF, &v4l2_buf)) { 15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("async_message_thread 2\n"); 15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgcode=VDPP_MSG_RESP_OUTPUT_BUFFER_DONE; 15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.status_code=VDPP_S_SUCCESS; 15611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf; 15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // driver returns ION buffer address, but case VDPP_MSG_RESP_OUTPUT_BUFFER_DONE 15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // will pass mmaped address to upper layer, and then driver sets it when returnning 16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // DQBUF for output buffers. 16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(omx->drv_ctx.output_num_planes); 16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // this len is used in fill_buffer_done buffer->nFilledLen 16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // is different from FTBProxy plane[0].length 16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.output_frame.len= v4l2_buf.m.planes[0].bytesused + v4l2_buf.m.planes[extra_idx].bytesused; 16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_HIGH("async_message_thread 2.5 omx->drv_ctx.op_buf.buffer_size = %d, plane[0].bytesused = %d, plane[%d].bytesused = %d\n", omx->drv_ctx.op_buf.buffer_size, v4l2_buf.m.planes[0].bytesused, extra_idx, v4l2_buf.m.planes[extra_idx].bytesused); 16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.output_frame.len=v4l2_buf.m.planes[0].bytesused; 17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_HIGH("async_message_thread 2.5 - 2 plane[0].bytesused = %d\n", v4l2_buf.m.planes[0].bytesused); 17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.output_frame.bufferaddr=(void*)v4l2_buf.m.planes[0].m.userptr; 17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // currently V4L2 driver just passes timestamp to maple FW, and maple FW 17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // pass the timestamp back to OMX 17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.output_frame.time_stamp = *(uint64_t *)(&v4l2_buf.timestamp); 17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_HIGH("async_message_thread 2.6.0 v4l2_buf.timestamp.tv_sec = 0x%08lx, v4l2_buf.timestamp.tv_usec = 0x%08lx\n", v4l2_buf.timestamp.tv_sec, v4l2_buf.timestamp.tv_usec); 17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdpp_msg) < 0) { 18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" async_message_thread Exited \n"); 18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // input buffer ready for empty buffer done (ebd) 18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((pfd[0].revents & POLLOUT) || (pfd[0].revents & POLLWRNORM)) { 18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_msginfo vdpp_msg; 18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 18911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.memory = V4L2_MEMORY_USERPTR; 19011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.length = omx->drv_ctx.input_num_planes; 19111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.m.planes = plane; 19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("async_message_thread 3\n"); 19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while(!ioctl(pfd[0].fd, VIDIOC_DQBUF, &v4l2_buf)) { 19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgcode=VDPP_MSG_RESP_INPUT_BUFFER_DONE; 19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.status_code=VDPP_S_SUCCESS; 19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf; 19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(omx->drv_ctx.input_num_planes); 19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.output_frame.len=v4l2_buf.m.planes[0].bytesused + v4l2_buf.m.planes[extra_idx].bytesused; // user doesn't need this for ebd, just set in case is used 20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_HIGH("async_message_thread 3.5 plane[0].bytesused = %d, plane[extra_idx].bytesused = %d\n", v4l2_buf.m.planes[0].bytesused, v4l2_buf.m.planes[extra_idx].bytesused); 20211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 20311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 20411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.output_frame.len=v4l2_buf.m.planes[0].bytesused; 20511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_HIGH("async_message_thread 3.5 - 2 plane[0].bytesused = %d\n", v4l2_buf.m.planes[0].bytesused); 20611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 20711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdpp_msg) < 0) { 20811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" async_message_thread Exited \n"); 20911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pfd[0].revents & POLLPRI){ 21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread 4\n"); 21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&dqevent, 0, sizeof(struct v4l2_event)); 21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(pfd[0].fd, VIDIOC_DQEVENT, &dqevent); 21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(dqevent.type == VPU_EVENT_HW_ERROR) 21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_msginfo vdpp_msg; 22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgcode=VDPP_MSG_EVT_HW_ERROR; 22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.status_code=VDPP_S_SUCCESS; 22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" SYS Error Recieved \n"); 22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdpp_msg) < 0) 22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" async_message_thread Exited \n"); 22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 22811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 22911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (dqevent.type == VPU_EVENT_FLUSH_DONE) { 23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_msginfo vdpp_msg; 23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&buf_type, dqevent.u.data, sizeof(buf_type)); 23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE == buf_type) 23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgcode=VDPP_MSG_RESP_FLUSH_INPUT_DONE; 23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.status_code=VDPP_S_SUCCESS; 23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VDPP Input Flush Done Recieved \n"); 23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdpp_msg) < 0) { 23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("\n async_message_thread Exited \n"); 24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 24211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 24311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE == buf_type) 24411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 24511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgcode=VDPP_MSG_RESP_FLUSH_OUTPUT_DONE; 24611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.status_code=VDPP_S_SUCCESS; 24711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VDPP Output Flush Done Recieved \n"); 24811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdpp_msg) < 0) { 24911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("\n async_message_thread Exited \n"); 25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 25311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 25411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 25511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Wrong buf_type recieved %d\n", buf_type); 25611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 25711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 25811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(dqevent.type == VPU_EVENT_ACTIVE_REGION_CHANGED) 25911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 26011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" VPU_EVENT_ACTIVE_REGION_CHANGED\n"); 26111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_msginfo vdpp_msg; 26211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgcode=VDPP_MSG_EVT_ACTIVE_REGION_DETECTION_STATUS; 26311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.status_code=VDPP_S_SUCCESS; 26411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 26511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // get the active region dection result struct from the event associated data 26611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&vdpp_msg.msgdata.ar_result, dqevent.u.data, sizeof(v4l2_rect)); 26711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" VPU_EVENT_ACTIVE_REGION_CHANGED Recieved \n"); 26811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(omx->m_ar_callback_setup) 26911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 27011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdpp_msg) < 0) 27111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" async_message_thread Exited \n"); 27311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 27411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 27511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 27611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 27711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 27811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 27911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" VPU Some Event recieved \n"); 28011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 28111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 28211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 28311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 28411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 28511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp: Async thread stop\n"); 28611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 28711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 28811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else // use stub to simulate vpu events for now 28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* async_message_thread (void *input) 29011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *buffer; 29211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 29311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pollfd pfd; 29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer v4l2_buf; 29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event dqevent; 29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp *omx = reinterpret_cast<omx_vdpp*>(input); 29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 30011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfd.fd = omx->drv_ctx.video_vpu_fd; 30111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0; 30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp: Async thread start\n"); 30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prctl(PR_SET_NAME, (unsigned long)"VdppCallBackThread", 0, 0, 0); 30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (1) 30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp: Async thread start 0\n"); 30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_wait(&(omx->drv_ctx.async_lock)); 30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp: Async thread start pfd.revents = %d\n", pfd.revents); 30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((omx->drv_ctx.etb_ftb_info.ftb_cnt > 0)) 31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("async_message_thread 1 omx->drv_ctx.etb_ftb_info.ftb_cnt = %d\n", omx->drv_ctx.etb_ftb_info.ftb_cnt); 31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_msginfo vdpp_msg; 31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p1 = 0; 31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p2 = 0; 31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned ident = 0; 31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.memory = V4L2_MEMORY_USERPTR; 31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->m_index_q_ftb.pop_entry(&p1,&p2,&ident); 31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.index = ident; 32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.bytesused = omx->drv_ctx.etb_ftb_info.ftb_len; 32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.etb_ftb_info.ftb_cnt--; 32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_message_thread 1.5 omx->drv_ctx.etb_ftb_info.ftb_cnt = %d\n", omx->drv_ctx.etb_ftb_info.ftb_cnt); 32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) */{ 32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("async_message_thread 2\n", rc); 32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgcode=VDPP_MSG_RESP_OUTPUT_BUFFER_DONE; 32611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.status_code=VDPP_S_SUCCESS; 32711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf; 32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.output_frame.len=v4l2_buf.bytesused; 32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.output_frame.bufferaddr=(void*)v4l2_buf.m.userptr; 33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) + 33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (uint64_t)v4l2_buf.timestamp.tv_usec; 33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdpp_msg) < 0) { 33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" async_message_thread Exited \n"); 33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(omx->drv_ctx.etb_ftb_info.etb_cnt > 0) { 34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_msginfo vdpp_msg; 34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p1 = 0; 34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p2 = 0; 34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned ident = 0; 34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.memory = V4L2_MEMORY_USERPTR; 34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->m_index_q_etb.pop_entry(&p1,&p2,&ident); 34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.index = ident; 34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("async_message_thread 3 omx->drv_ctx.etb_ftb_info.etb_cnt = %d\n", omx->drv_ctx.etb_ftb_info.etb_cnt); 35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.etb_ftb_info.etb_cnt--; 35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("async_message_thread 4 omx->drv_ctx.etb_ftb_info.etb_cnt = %d\n", omx->drv_ctx.etb_ftb_info.etb_cnt); 35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf))*/ { 35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgcode=VDPP_MSG_RESP_INPUT_BUFFER_DONE; 35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.status_code=VDPP_S_SUCCESS; 35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf; 35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&vdpp_msg) < 0) { 35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" async_message_thread Exited \n"); 35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(omx->drv_ctx.thread_exit) 36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 36911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp: Async thread stop\n"); 37011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* message_thread(void *input) 37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp* omx = reinterpret_cast<omx_vdpp*>(input); 37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char id; 37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int n; 37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp: message thread start\n"); 38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prctl(PR_SET_NAME, (unsigned long)"VideoPostProcessingMsgThread", 0, 0, 0); 38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (1) 38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel n = read(omx->m_pipe_in, &id, 1); 38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 38711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(0 == n) 38811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 38911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 39011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 39111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 39211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (1 == n) 39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->process_event_cb(omx, id); 39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((n < 0) && (errno != EINTR)) 39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: read from pipe failed, ret %d errno %d", n, errno); 39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp: message thread stop\n"); 40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid post_message(omx_vdpp *omx, unsigned char id) 40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret_value; 40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp: post_message %d pipe out 0x%x\n", id,omx->m_pipe_out); 41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret_value = write(omx->m_pipe_out, &id, 1); 41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_HIGH("post_message to pipe done %d\n",ret_value); 41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 41411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx_cmd_queue destructor 41511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdpp::omx_cmd_queue::~omx_cmd_queue() 41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Nothing to do 41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue constructor 42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdpp::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0) 42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE); 42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue insert 42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id) 42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE) 43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_q[m_write].id = id; 43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_q[m_write].param1 = p1; 43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_q[m_write].param2 = p2; 43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_write++; 43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_size ++; 43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) 43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_write = 0; 44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 44111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 44211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 44311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 44411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 44511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__); 44611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 44711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 44811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue pop 45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id) 45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_size > 0) 45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *id = m_q[m_read].id; 45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p1 = m_q[m_read].param1; 45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p2 = m_q[m_read].param2; 45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Move the read pointer ahead 46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ++m_read; 46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel --m_size; 46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) 46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_read = 0; 46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Retrieve the first mesg type in the queue 47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned omx_vdpp::omx_cmd_queue::get_q_msg_type() 47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return m_q[m_read].id; 47811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdpp::ts_arr_list::ts_arr_list() 48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //initialize timestamps array 48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) ); 48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 48611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdpp::ts_arr_list::~ts_arr_list() 48711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 48811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //free m_ts_arr_list? 48911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 49011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 49111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::ts_arr_list::insert_ts(OMX_TICKS ts) 49211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 49311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 49411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool duplicate_ts = false; 49511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int idx = 0; 49611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 49711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //insert at the first available empty location 49811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) 49911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_ts_arr_list[idx].valid) 50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //found invalid or empty entry, save timestamp 50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ts_arr_list[idx].valid = true; 50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ts_arr_list[idx].timestamp = ts; 50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)", 50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts, idx); 50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) 51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert"); 51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::ts_arr_list::pop_min_ts(OMX_TICKS &ts) 52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int min_idx = -1; 52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TICKS min_ts = 0; 52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int idx = 0; 52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) 52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_ts_arr_list[idx].valid) 53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //found valid entry, save index 53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (min_idx < 0) 53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //first valid entry 53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_ts = m_ts_arr_list[idx].timestamp; 53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_idx = idx; 53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_ts_arr_list[idx].timestamp < min_ts) 53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_ts = m_ts_arr_list[idx].timestamp; 54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel min_idx = idx; 54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (min_idx < 0) 54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //no valid entries found 55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop"); 55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts = 0; 55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts = m_ts_arr_list[min_idx].timestamp; 55711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ts_arr_list[min_idx].valid = false; 55811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)", 55911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ts, min_idx); 56011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 56111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 56211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 56311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 56411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 56511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 56611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 56711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::ts_arr_list::reset_ts_list() 56811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 56911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 57011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int idx = 0; 57111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 57211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list"); 57311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) 57411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 57511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ts_arr_list[idx].valid = false; 57611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 57711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 57811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 57911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 58011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 58111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// factory function executed by the core to create instances 58211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid *get_omx_component_factory_fn(void) 58311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 58411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return (new omx_vdpp); 58511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 58611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 58711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 58811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 58911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::omx_vdpp 59011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 59111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 59211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Constructor 59311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 59411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 59511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None 59611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 59711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 59811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 59911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 60011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdpp::omx_vdpp(): m_ar_callback_setup(false), 60111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_error_propogated(false), 60211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state(OMX_StateInvalid), 60311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data(NULL), 60411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr(NULL), 60511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr(NULL), 60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_err_count(0), 60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress (false), 60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress (false), 60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer (false), 61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_use_buffer (false), 61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ouput_egl_buffers(false), 61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_output_pmem(OMX_FALSE), 61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_region_smi(OMX_FALSE), 61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_pvt_entry_pmem(OMX_FALSE), 61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers(0), 61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers(0), 61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_qbuf_count(0), 61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_dqbuf_count(0), 61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_qbuf_count(0), 62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_dqbuf_count(0), 62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_BUFFER_LOG 62211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_buffer_write_counter(0), 62311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_buffer_write_counter(0), 62411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 62511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count(0), 62611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bm_count(0), 62711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bPopulated(OMX_FALSE), 62811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bPopulated(OMX_FALSE), 62911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_flags(0), 63011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bEnabled(OMX_TRUE), 63111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bEnabled(OMX_TRUE), 63211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_in_alloc_cnt(0), 63311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list(NULL), 63411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_entry(NULL), 63511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info(NULL), 63611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame (NULL), 63711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame (NULL), 63811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr (NULL), 63911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr(NULL), 64011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_heap_inp_bm_count (0), 64111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts(LLONG_MAX), 64211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts(true), 64311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int(0), 64411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel in_reconfig(false), 64511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata(0), 64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_enable_android_native_buffers(OMX_FALSE), 64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_android_native_buffers(OMX_FALSE), 64811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_set_fps(false), 64911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_user_flag(false) 65011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 65111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("In OMX vdpp Constructor"); 65211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 65311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_cmp,0,sizeof(m_cmp)); 65411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_cb,0,sizeof(m_cb)); 65511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset (&drv_ctx,0,sizeof(drv_ctx)); 65611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_id = 0; 65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_id = 0; 65811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_created = false; 65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_created = false; 66011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.timestamp_adjust = false; 66511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_vpu_fd = -1; 66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(&m_lock, NULL); 66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_init(&m_cmd_lock,0,0); 66811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = false; 66911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[OUTPUT_PORT] = false; 67011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 67111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB; 67211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 67311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef STUB_VPU 67411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.thread_exit = false; 67511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_init(&(drv_ctx.async_lock),0,0); 67611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 67711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 67811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 67911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE subscribe_to_events(int fd) 68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 68111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event_subscription sub; 68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 68411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 68511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid input: %d\n", fd); 68611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 68711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 68811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 68911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 69011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sub.type = V4L2_EVENT_ALL; 69111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 69211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc < 0) 69311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 69411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x\n", sub.type); 69511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNotImplemented; 69611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 69711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 69811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 69911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 70011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 70111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 70211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 70311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE unsubscribe_to_events(int fd) 70411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 70511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 70611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event_subscription sub; 70711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 70811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 70911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 71011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid input: %d\n", fd); 71111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 71211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 71311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 71411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 71511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sub, 0, sizeof(sub)); 71611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sub.type = V4L2_EVENT_ALL; 71711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 71811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 71911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x\n", sub.type); 72011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 72111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 72211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 72411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 72511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 72711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 72811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::~omx_vdpp 72911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 73111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Destructor 73211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 73411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None 73511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 73711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 73811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 73911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdpp::~omx_vdpp() 74011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 74111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pmem_info = NULL; 74211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("In OMX vdpp Destructor"); 74311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_pipe_in) close(m_pipe_in); 74411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_pipe_out) close(m_pipe_out); 74511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_in = -1; 74611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_out = -1; 74711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit"); 74811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (msg_thread_created) 74911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_join(msg_thread_id,NULL); 75011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit"); 75111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 75211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef STUB_VPU 75311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("drv_ctx.etb_ftb_info.ftb_cnt = %d, drv_ctx.etb_ftb_info.etb_cnt = %d", drv_ctx.etb_ftb_info.ftb_cnt, drv_ctx.etb_ftb_info.etb_cnt); 75411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.etb_ftb_info.ftb_cnt = 0; 75511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.etb_ftb_info.etb_cnt = 0; 75611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&(drv_ctx.async_lock)); 75711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.thread_exit = true; 75811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 75911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // notify async thread to exit 76011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("write control pipe to notify async thread to exit"); 76111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel write(m_ctrl_out, "1", 1); 76211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 76311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (async_thread_created) 76411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_join(async_thread_id,NULL); 76511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("async_thread exits"); 76611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsubscribe_to_events(drv_ctx.video_vpu_fd); 76711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.video_vpu_fd); 76811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_destroy(&m_lock); 76911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_destroy(&m_cmd_lock); 77011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 77111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef STUB_VPU 77211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_destroy(&(drv_ctx.async_lock)); 77311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 77411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_ctrl_in) close(m_ctrl_in); 77511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_ctrl_out) close(m_ctrl_out); 77611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ctrl_in = -1; 77711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ctrl_out = -1; 77811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Exit OMX vdpp Destructor"); 77911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 78011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 78111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint release_buffers(omx_vdpp* obj, enum vdpp_buffer buffer_type) { 78211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 78311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 78411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 78511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_type == VDPP_BUFFER_TYPE_OUTPUT){ 78611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 78711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 0; 78811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 78911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(obj->drv_ctx.video_vpu_fd,VIDIOC_REQBUFS, &bufreq); 79011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel }else if(buffer_type == VDPP_BUFFER_TYPE_INPUT) { 79111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 79211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 0; 79311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 79411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(obj->drv_ctx.video_vpu_fd,VIDIOC_REQBUFS, &bufreq); 79511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 79611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 79711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 79811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 79911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 80011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 80111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 80211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::process_event_cb 80311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 80411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 80511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel IL Client callbacks are generated through this routine. The VDPP 80611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel provides the thread context for this routine. 80711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 80811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 80911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctxt -- Context information related to the self. 81011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id -- Event identifier. This could be any of the following: 81111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1. Command completion event 81211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2. Buffer done callback event 81311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3. Frame done callback event 81411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 81511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 81611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 81711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 81811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 81911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdpp::process_event_cb(void *ctxt, unsigned char id) 82011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 82111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel signed p1; // Parameter - 1 82211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel signed p2; // Parameter - 2 82311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned ident; 82411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned qsize=0; // qsize 82511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp *pThis = (omx_vdpp *) ctxt; 82611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 82711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!pThis) 82811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 82911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n", 83011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel __func__); 83111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 83211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 83311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 83411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Protect the shared queue data structure 83511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel do 83611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 83711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Read the message id's from the queue*/ 83811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&pThis->m_lock); 83911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 84011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // first check command queue 84111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_cmd_q.m_size; 84211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(qsize) 84311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 84411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 84511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_HIGH("process_event_cb m_cmd_q.pop_entry ident = %d", ident); 84611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 84711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 84811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // then check ftb queue 84911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize == 0 && pThis->m_state != OMX_StatePause) 85011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 85111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 85211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_ftb_q.m_size; 85311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize) 85411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 85511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 85611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("process_event_cb, p1 = 0x%08x, p2 = 0x%08x, ident = 0x%08x", p1, p2, ident); 85711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 85811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 85911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 86011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // last check etb queue 86111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize == 0 && pThis->m_state != OMX_StatePause) 86211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 86311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_etb_q.m_size; 86411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize) 86511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 86611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 86711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 86811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 86911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&pThis->m_lock); 87011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 87111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*process message if we have one*/ 87211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(qsize > 0) 87311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 87411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id = ident; 87511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (id) 87611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 87711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EVENT: 87811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) 87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (p1) 88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandStateSet: 88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = (OMX_STATETYPE) p2; 88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" OMX_CommandStateSet complete, m_state = %d, pThis->m_cb.EventHandler = %p", 88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state, pThis->m_cb.EventHandler); 88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL); 88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_EventError: 89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(p2 == OMX_StateInvalid) 89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" OMX_EventError: p2 is OMX_StateInvalid"); 89411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = (OMX_STATETYPE) p2; 89511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 89611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventError, OMX_ErrorInvalidState, p2, NULL); 89711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 89811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p2 == OMX_ErrorHardware) 89911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 90011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error(); 90111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 90211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 90311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 90411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventError, p2, (OMX_U32)NULL, NULL ); 90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortDisable: 91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" OMX_CommandPortDisable complete for port [%d], pThis->in_reconfig = %d", p2, pThis->in_reconfig); 91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) 91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == OMX_CORE_OUTPUT_PORT_INDEX) 91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(release_buffers(pThis, VDPP_BUFFER_TYPE_OUTPUT)) 92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to release output buffers\n"); 92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf); 92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->in_reconfig = false; 92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eRet != OMX_ErrorNone) 92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error(); 92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 93011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 93111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == OMX_CORE_INPUT_PORT_INDEX) 93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX); 93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(release_buffers(pThis, VDPP_BUFFER_TYPE_INPUT)) 93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to release output buffers\n"); 93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.ip_buf); 93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->in_reconfig = false; 94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eRet != OMX_ErrorNone) 94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error(); 94411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 94511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 94611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 94711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL ); 94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 95011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortEnable: 95111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" OMX_CommandPortEnable complete for port [%d]", p2); 95211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ 95311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL ); 95411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 95511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 95611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 95711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 95811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL ); 95911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 96011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 96111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 96211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 96311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 96411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 96511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__); 96611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 96711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 96811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 96911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_ETB: 97011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 97111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) 97211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 97311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" empty_this_buffer_proxy failure"); 97411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 97511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 97611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 97711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 97811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_FTB: 97911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 98011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX_COMPONENT_GENERATE_FTB p2 = 0x%08x", p2); 98111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 98211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) 98311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 98411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" fill_this_buffer_proxy failure"); 98511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 98611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 98711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 98811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 98911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 99011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_COMMAND: 99111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\ 99211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_U32)p2,(OMX_PTR)NULL); 99311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 99411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 99511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EBD: 99611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDPP_S_SUCCESS && p2 != VDPP_S_INPUT_BITSTREAM_ERR) 99711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 99811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" OMX_COMPONENT_GENERATE_EBD failure"); 99911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" OMX_COMPONENT_GENERATE_EBD 1"); 100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == VDPP_S_INPUT_BITSTREAM_ERR && p1) 100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_inp_err_count++; 100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" OMX_COMPONENT_GENERATE_EBD 2"); 100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //pThis->time_stamp_dts.remove_time_stamp( 100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp, 101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //(pThis->drv_ctx.interlace != VDPP_InterlaceFrameProgressive) 101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // ?true:false); 101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_inp_err_count = 0; 101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( pThis->empty_buffer_done(&pThis->m_cmp, 101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) 101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" empty_buffer_done failure"); 102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_EBD 4"); 102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(pThis->m_inp_err_count >= MAX_INPUT_ERROR) 102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR); 102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 102911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_FBD: 103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDPP_S_SUCCESS) 103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 103411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_FBD failure"); 103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 103711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if ( pThis->fill_buffer_done(&pThis->m_cmp, 103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) 103911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 104011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" fill_buffer_done failure"); 104111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 104211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 104311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 104411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 104511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH: 104611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Driver flush i/p Port complete"); 104711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->input_flush_progress) 104811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 104911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" WARNING: Unexpected flush from driver"); 105011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 105111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 105211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 105311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->execute_input_flush(); 105411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) 105511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 105611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDPP_S_SUCCESS) 105711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 105811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure"); 105911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 106011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 106111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 106211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 106311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if we need generate event for Flush done*/ 106411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT(&pThis->m_flags, 106511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_INPUT_FLUSH_PENDING)) 106611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 106711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING); 106811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Input Flush completed - Notify Client"); 106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandFlush, 107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX,NULL ); 107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_IDLE_PENDING)) 107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) { 107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Failed to call streamoff on OUTPUT Port \n"); 107811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 108011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Successful to call streamoff on OUTPUT Port \n"); 108111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->streaming[OUTPUT_PORT] = false; 108211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->output_flush_progress) 108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Input flush done hence issue stop"); 108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->post_event ((unsigned int)NULL, VDPP_S_SUCCESS,\ 108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_STOP_DONE); 108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 109611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH: 110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Driver flush o/p Port complete"); 110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->output_flush_progress) 110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" WARNING: Unexpected flush from driver"); 110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 110711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->execute_output_flush(); 110811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) 110911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 111011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDPP_S_SUCCESS) 111111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed"); 111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if we need generate event for Flush done*/ 111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT(&pThis->m_flags, 111911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) 112011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 112111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Notify Output Flush done"); 112211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 112311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandFlush, 112511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX,NULL ); 112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT(&pThis->m_flags, 112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) 112911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 113011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Internal flush complete"); 113111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags, 113211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 113411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) 113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->post_event(OMX_CommandPortDisable, 113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, 113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags, 114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 114211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 114311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 114411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 114511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH 1 \n"); 114611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) 114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH 2 \n"); 115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) { 115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Failed to call streamoff on CAPTURE Port \n"); 115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 115411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->streaming[CAPTURE_PORT] = false; 115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH 3 pThis->input_flush_progress =%d \n", pThis->input_flush_progress); 115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->input_flush_progress) 115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Output flush done hence issue stop"); 116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->post_event ((unsigned int)NULL, VDPP_S_SUCCESS,\ 116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_STOP_DONE); 116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 116811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 116911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 117011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 117111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 117211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 117311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_START_DONE: 117411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_START_DONE"); 117511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) 117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDPP_S_SUCCESS) 117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_START_DONE Failure"); 118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 118511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_START_DONE Success"); 118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) 118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Move to executing"); 118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StateExecuting; 119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 119311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 119411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateExecuting, NULL); 119511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 119611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (BITMASK_PRESENT(&pThis->m_flags, 119711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_PAUSE_PENDING)) 119811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (/*ioctl (pThis->drv_ctx.video_vpu_fd, 120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VDPP_IOCTL_CMD_PAUSE,NULL ) < */0) 120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" VDPP_IOCTL_CMD_PAUSE failed"); 120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 120411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Event Handler callback is NULL"); 121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_PAUSE_DONE: 121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE"); 121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) 121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDPP_S_SUCCESS) 121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed"); 122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 122511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->complete_pending_buffer_done_cbs(); 122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) 122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_PAUSE_DONE nofity"); 122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Send the callback now 123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING); 123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StatePause; 123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StatePause, NULL); 123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 123811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 123911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 124511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_RESUME_DONE: 124611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_RESUME_DONE"); 124711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) 124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDPP_S_SUCCESS) 125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 125111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_RESUME_DONE failed"); 125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) 125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Moving the VDPP to execute state"); 125911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 126111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StateExecuting; 126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateExecuting,NULL); 126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 126911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 127011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_STOP_DONE: 127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_STOP_DONE"); 127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) 127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 != VDPP_S_SUCCESS) 128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_STOP_DONE ret failed"); 128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->complete_pending_buffer_done_cbs(); 128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) 128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_STOP_DONE Success"); 129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING); 129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StateIdle; 129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Move to Idle State, pThis->m_cb.EventHandler = %p", pThis->m_cb.EventHandler); 129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data, 129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateIdle,NULL); 129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_STOP_DONE cb finished"); 129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG"); 131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == OMX_IndexParamPortDefinition) { 131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->in_reconfig = true; 131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventPortSettingsChanged, p1, p2, NULL ); 131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->drv_ctx.interlace != V4L2_FIELD_NONE/*VDPP_InterlaceFrameProgressive*/) 132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1; 132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged; 132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->drv_ctx.interlace == V4L2_FIELD_INTERLACED_TB/*VDPP_InterlaceInterleaveFrameTopFieldFirst*/) 132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel format = OMX_InterlaceInterleaveFrameTopFieldFirst; 132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (pThis->drv_ctx.interlace == V4L2_FIELD_INTERLACED_BT/*VDPP_InterlaceInterleaveFrameBottomFieldFirst*/) 132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel format = OMX_InterlaceInterleaveFrameBottomFieldFirst; 132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else //unsupported interlace format; raise a error 133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel event = OMX_EventError; 133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel event, format, 0, NULL ); 133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EOS_DONE: 134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_EOS_DONE"); 134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag, 134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL ); 134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 134611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 134711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 134811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->prev_ts = LLONG_MAX; 134911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->rst_prev_ts = true; 135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_HARDWARE_ERROR"); 135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING: 135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING\n"); 135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_unsupported_setting(); 136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG: 136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG"); 136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL ); 136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // extensions 137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_ACTIVE_REGION_DETECTION_STATUS: 137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_rect * ar_result = (struct v4l2_rect *) p1; 137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_ACTIVEREGIONDETECTION_STATUSTYPE arstatus; 137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arstatus.nSize = sizeof(QOMX_ACTIVEREGIONDETECTION_STATUSTYPE); 137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arstatus.nPortIndex = 0; 137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel arstatus.bDetected = OMX_TRUE; 138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&arstatus.sDetectedRegion, ar_result, sizeof(QOMX_RECTTYPE)); 138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" OMX_COMPONENT_GENERATE_ACTIVE_REGION_DETECTION_STATUS"); 138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // data2 should be (OMX_INDEXTYPE)OMX_QcomIndexConfigActiveRegionDetectionStatus 138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // pdata should be QOMX_ACTIVEREGIONDETECTION_STATUSTYPE 138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_cb.EventHandler) { 138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, (OMX_INDEXTYPE)OMX_QcomIndexConfigActiveRegionDetectionStatus, &arstatus); 138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&pThis->m_lock); 139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_cmd_q.m_size; 139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_state != OMX_StatePause) 139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size); 139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&pThis->m_lock); 140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while(qsize>0); 140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdpp::update_resolution(uint32_t width, uint32_t height, uint32_t stride, uint32_t scan_lines) 140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int format_changed = 0; 140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((height != drv_ctx.video_resolution_input.frame_height) || 140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (width != drv_ctx.video_resolution_input.frame_width)) { 141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("NOTE: W/H %d (%d), %d (%d)\n", 141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel width, drv_ctx.video_resolution_input.frame_width, 141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel height,drv_ctx.video_resolution_input.frame_height); 141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel format_changed = 1; 141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.frame_height = height; 141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.frame_width = width; 141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.scan_lines = scan_lines; 141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.stride = stride; 141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nLeft = 0; 142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nTop = 0; 142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nWidth = drv_ctx.video_resolution_input.frame_width; 142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rectangle.nHeight = drv_ctx.video_resolution_input.frame_height; 142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return format_changed; 142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::ComponentInit 142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Initialize the component. 143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctxt -- Context information related to the self. 143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id -- Event identifier. This could be any of the following: 143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1. Command completion event 143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2. Buffer done callback event 143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3. Frame done callback event 143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 144011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::component_init(OMX_STRING role) 144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fds[2]; 145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fctl[2]; 145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret=0; 145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int i = 0; 145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int sessionNum = 0; 145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel errno = 0; 145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_vpu_fd = openInput("msm_vpu"); 145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_vpu_fd = 1; 146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" omx_vdpp::component_init(): Open returned fd %d, errno %d", 146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_vpu_fd, errno); 146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.video_vpu_fd == 0){ 146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("omx_vdpp:: Got fd as 0 for vpu, Opening again\n"); 146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_vpu_fd = openInput("msm_vpu"); 146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.video_vpu_fd < 0) 147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("omx_vdpp::Comp Init Returning failure, errno %d\n", errno); 147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // query number of sessions and attach to session #1 147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Check how many sessions are suported by H/W */ 147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd, VPU_QUERY_SESSIONS, 148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.sessionsSupported); 148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret < 0) 148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("QUERY_SESSIONS: VPU_QUERY_SESSIONS failed."); 148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.video_vpu_fd); 148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_vpu_fd = 0; 148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("QUERY_SESSIONS: The number of sessions supported are %d.", 149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.sessionsSupported); 149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Attach Client to Session. */ 149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sessionNum = VDPP_SESSION; 149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd, VPU_ATTACH_TO_SESSION, &sessionNum); 150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret < 0) 150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if( errno == EINVAL ) 150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VPU_ATTACH_TO_SESSION: session %d is out of valid " 150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "range.", sessionNum); 150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if( errno == EBUSY) 150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VPU_ATTACH_TO_SESSION: max. allowed number of" 150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "clients attached to session."); 150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VPU_ATTACH_TO_SESSION: failed for unknown reason."); 151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VPU_ATTACH_TO_SESSION: client successfully attached " 151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "to session."); 151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.sessionAttached = sessionNum; 151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS; 152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator = 1; 152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = subscribe_to_events(drv_ctx.video_vpu_fd); 152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* create control pipes */ 152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ret) 152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(pipe(fctl)) 152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("pipe creation failed\n"); 153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int temp2[2]; 153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(fctl[0] == 0 || fctl[1] == 0) 153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pipe (temp2)) 153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("pipe creation failed\n"); 154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fctl[0] = temp2 [0]; 154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fctl[1] = temp2 [1]; 154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ctrl_in = fctl[0]; 154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ctrl_out = fctl[1]; 154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fcntl(m_ctrl_in, F_SETFL, O_NONBLOCK); 155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fcntl(m_ctrl_out, F_SETFL, O_NONBLOCK); 155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ret) { 155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_created = true; 155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = pthread_create(&async_thread_id,0,async_message_thread,this); 155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ret) { 155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Failed to create async_message_thread \n"); 156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_created = false; 156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef INPUT_BUFFER_LOG 156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel inputBufferFile = open(inputfilename, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR | S_IWUSR); 156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(inputBufferFile < 0) 156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Failed to create inputBufferFile 0, errno = %d\n", errno); 156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_BUFFER_LOG 157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel outputBufferFile = open(outputfilename, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR | S_IWUSR); 157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(outputBufferFile < 0) 157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Failed to create outputBufferFile 0 , errno = %d\n", errno); 157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG 158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel outputExtradataFile = open (ouputextradatafilename, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR | S_IWUSR); 158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(outputExtradataFile == -1) 158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Failed to create outputExtradataFile , errno = %d\n", errno); 158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Copy the role information which provides the vdpp kind 159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(drv_ctx.kind,role,128); 159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Default set to progressive mode for 8084. drv_ctx.interlace will be changed by 159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // interlace format filed of OMX buffer header extra data. User can also overwrite 159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // this setting by OMX_IndexParamInterlaceFormat 159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = V4L2_FIELD_NONE; 159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Default input pixel format 159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_capability=V4L2_PIX_FMT_NV12; 159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) 160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // set default output format to V4L2_PIX_FMT_NV12. User can use SetParam 160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // with OMX_IndexParamVideoPortFormat to set vdpp output format 160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_format = V4L2_PIX_FMT_NV12; 160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capture_capability = V4L2_PIX_FMT_NV12; 160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_capability cap; 160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_QUERYCAP, &cap); 161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to query capabilities\n"); 161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s," 161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " version = %d, capabilities = %x\n", cap.driver, cap.card, 161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cap.bus_info, cap.version, cap.capabilities); 161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((cap.capabilities & V4L2_CAP_STREAMING) == 0) 161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("device does not support streaming i/o\n"); 162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // set initial input h/w and pixel format 162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel update_resolution(640, 480, 640, 480); 162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution_input.frame_height; 163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution_input.frame_width; 163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (V4L2_FIELD_NONE == drv_ctx.interlace) 163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_INTERLACED; 163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // NV12 has 2 planes. 164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Set format for each plane. */ 164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setFormatParams(output_capability, drv_ctx.input_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.input_bytesperpixel[i] * fmt.fmt.pix_mp.height); 164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].bytesperline = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.input_bytesperpixel[0]); // NV12 UV plane has the same width as Y, but 1/2 YH 164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" fmt.fmt.pix_mp.plane_fmt[%d].sizeimage = %d \n ", i, fmt.fmt.pix_mp.plane_fmt[i].sizeimage); 164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set format on output port\n"); 165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Set Format was successful drv_ctx.interlace = %d\n ", drv_ctx.interlace); 165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // set initial output format 166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // initial input/output resolution are the same. portdefinition changes both 166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0, sizeof(fmt)); 166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution_input.frame_height; 166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution_input.frame_width; 166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VP output frame width = %d, height = %d", fmt.fmt.pix_mp.width, 166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height); 167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setFormatParams(capture_capability, drv_ctx.output_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * 167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_bytesperpixel[i] * 167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height); 167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].bytesperline = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.output_bytesperpixel[0]); 167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" fmt.fmt.pix_mp.plane_fmt[%d].sizeimage = %d \n ", i, fmt.fmt.pix_mp.plane_fmt[i].sizeimage); 167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret < 0) 168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_S_FMT setup VP output format error"); 168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // update initial output resolution 168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_height = fmt.fmt.pix_mp.height; 169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_width = fmt.fmt.pix_mp.width; 169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.scan_lines = fmt.fmt.pix_mp.height; 169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.stride = fmt.fmt.pix_mp.width; 169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set format on capture port\n"); 169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Set Format was successful \n "); 169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Get the Buffer requirements for input and output ports*/ 170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_type = VDPP_BUFFER_TYPE_INPUT; 170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_type = VDPP_BUFFER_TYPE_OUTPUT; 170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.alignment=SZ_4K; 170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.alignment=SZ_4K; 170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StateLoaded; 170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet=get_buffer_req(&drv_ctx.ip_buf); 171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size); 171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel get_buffer_req(&drv_ctx.op_buf); 171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* create pipes for message thread*/ 171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(pipe(fds)) 171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("pipe creation failed\n"); 171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int temp1[2]; 172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(fds[0] == 0 || fds[1] == 0) 172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pipe (temp1)) 172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("pipe creation failed\n"); 172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fds[0] = temp1 [0]; 173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fds[1] = temp1 [1]; 173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_in = fds[0]; 173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_out = fds[1]; 173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_created = true; 173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = pthread_create(&msg_thread_id,0,message_thread,this); 173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ret < 0) 173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" component_init(): message_thread creation failed"); 174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_created = false; 174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet != OMX_ErrorNone) 174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Component Init Failed"); 174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" omx_vdpp::component_init() success"); 175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::GetComponentVersion 176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns the component version. 176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 176611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel TBD. 176711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 176811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone. 177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::get_component_version 177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ( 177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_STRING componentName, 177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* componentVersion, 177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* specVersion, 177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_UUIDTYPE* componentUUID 177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StateInvalid) 178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n"); 178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* TBD -- Return the proper version */ 178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (specVersion) 178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel specVersion->nVersion = OMX_SPEC_VERSION; 179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::SendCommand 179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns zero if all the buffers released.. 179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::send_command(OMX_IN OMX_HANDLETYPE hComp, 180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_COMMANDTYPE cmd, 180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 param1, 181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR cmdData 181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" send_command: Recieved a Command from Client cmd = %d", cmd); 181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StateInvalid) 181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n"); 181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX 182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) 182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" send_command(): ERROR OMX_CommandFlush " 182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "to invalid port: %lu", param1); 182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND); 182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_wait(&m_cmd_lock); 182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" send_command: Command Processed cmd = %d\n", cmd); 182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::SendCommand 183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns zero if all the buffers released.. 183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, 184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_COMMANDTYPE cmd, 184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 param1, 184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR cmdData 185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE eState = (OMX_STATETYPE) param1; 185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int bFlag = 1,sem_posted = 0,ret=0; 185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" send_command_proxy(): cmd = %d", cmd); 185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("end_command_proxy(): Current State %d, Expected State %d", 185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state, eState); 185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(cmd == OMX_CommandStateSet) 186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued"); 186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState); 186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Loaded */ 186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StateLoaded) 186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eState == OMX_StateIdle) 187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //if all buffers are allocated or all ports disabled 187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(allocate_done() || 187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) 187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n"); 187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n"); 188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING); 188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Loaded */ 188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateLoaded) 188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n"); 188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to WaitForResources */ 189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateWaitForResources) 189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition */ 189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n"); 189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Executing */ 190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateExecuting) 190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n"); 190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Pause */ 190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StatePause) 191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n"); 191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Invalid */ 191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateInvalid) 191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n"); 192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\ 192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eState); 192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is IDLE */ 193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(m_state == OMX_StateIdle) 193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eState == OMX_StateLoaded) 193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(release_done()) 193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Since error is None , we will post an event at the end 194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel of this function definition 194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n"); 194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n"); 194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING); 195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Executing */ 195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateExecuting) 195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING); 195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 1; 196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state=OMX_StateExecuting; 196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful\n"); 196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Idle */ 196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateIdle) 196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n"); 196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to WaitForResources */ 197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateWaitForResources) 197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n"); 197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Pause */ 198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StatePause) 198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*To pause the Video core we need to start the driver*/ 198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (/*ioctl (drv_ctx.video_vpu_fd,VDPP_IOCTL_CMD_START, 198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NULL) < */0) 198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" VDPP_IOCTL_CMD_START FAILED"); 198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n"); 199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Invalid */ 199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateInvalid) 199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n"); 200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState); 200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /******************************/ 201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Executing */ 201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /******************************/ 201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(m_state == OMX_StateExecuting) 201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Command Recieved in OMX_StateExecuting"); 201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Idle */ 201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eState == OMX_StateIdle) 201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition 202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" send_command_proxy(): Executing --> Idle \n"); 202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!sem_posted) 202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_ALL); 203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Paused */ 203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StatePause) 203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" PAUSE Command Issued"); 203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StatePause; 203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 1; 203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Loaded */ 204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateLoaded) 204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 204311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" send_command_proxy(): Executing --> Loaded \n"); 204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to WaitForResources */ 204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateWaitForResources) 205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" send_command_proxy(): Executing --> WaitForResources \n"); 205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Executing */ 205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateExecuting) 205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" send_command_proxy(): Executing --> Executing \n"); 206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 206211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 206311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Invalid */ 206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateInvalid) 206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" send_command_proxy(): Executing --> Invalid \n"); 206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState); 207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Pause */ 207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(m_state == OMX_StatePause) 208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Executing */ 208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eState == OMX_StateExecuting) 208411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Pause --> Executing \n"); 208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StateExecuting; 208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 1; 208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Idle */ 209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateIdle) 209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition */ 209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Pause --> Idle \n"); 209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!sem_posted) 209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_ALL); 210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to loaded */ 210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateLoaded) 210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 210711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Pause --> loaded \n"); 210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to WaitForResources */ 211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateWaitForResources) 211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Pause --> WaitForResources \n"); 211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 212011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Pause */ 212111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StatePause) 212211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 212311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Pause --> Pause \n"); 212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Invalid */ 212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateInvalid) 213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Pause --> Invalid \n"); 213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState); 213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is WaitForResources */ 214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(m_state == OMX_StateWaitForResources) 214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Loaded */ 214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eState == OMX_StateLoaded) 214811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 214911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition */ 215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n"); 215211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 215311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to WaitForResources */ 215411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) 215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n"); 215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState, 215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Executing */ 216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateExecuting) 216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n"); 216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Pause */ 217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StatePause) 217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n"); 217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Invalid */ 217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(eState == OMX_StateInvalid) 217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n"); 218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Loaded - 218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is NOT tested by Khronos TS */ 218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState); 219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /********************************/ 219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Invalid */ 219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*******************************/ 219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(m_state == OMX_StateInvalid) 219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* State Transition from Inavlid to any state */ 220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eState == (OMX_StateLoaded || OMX_StateWaitForResources 220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || OMX_StateIdle || OMX_StateExecuting 220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || OMX_StatePause || OMX_StateInvalid)) 220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n"); 220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorInvalidState,\ 220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmd == OMX_CommandFlush) 221111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 221211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" send_command_proxy(): OMX_CommandFlush issued " 221311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "with param1: 0x%x", param1); 221411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) 221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { // do not call flush ioctl if there is no buffer queued. Just return callback 221611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU // VPU stub doesn't set any streaming flag 221711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!streaming[OUTPUT_PORT]) 221811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 221911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EventHandler(&m_cmp, m_app_data, OMX_EventCmdComplete,OMX_CommandFlush, 222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX,NULL ); 222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); 222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) 223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted){ 223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Set the Semaphore"); 223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(param1); 223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if ( cmd == OMX_CommandPortEnable) 224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" send_command_proxy(): OMX_CommandPortEnable issued " 224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "with param1: %lu", param1); 224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) 224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bEnabled = OMX_TRUE; 224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if( (m_state == OMX_StateLoaded && 225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || allocate_input_done()) 225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX, 225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n"); 226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING); 226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) 226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Enable output Port command recieved"); 226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bEnabled = OMX_TRUE; 226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if( (m_state == OMX_StateLoaded && 227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (allocate_output_done())) 227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX, 227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n"); 228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmd == OMX_CommandPortDisable) 228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" send_command_proxy(): OMX_CommandPortDisable issued" 229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "with param1: %lu m_state = %d, streaming[OUTPUT_PORT] = %d", param1, m_state, streaming[OUTPUT_PORT]); 229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) 229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bEnabled = OMX_FALSE; 229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_input_done()) 229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX, 229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_CommandPortDisable 1"); 230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING); 230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_CommandPortDisable 2"); 230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting) 230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!sem_posted) 230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!streaming[OUTPUT_PORT]) 231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_CommandPortDisable 3 "); 231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //IL client calls disable port and then free buffers. 231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //from free buffer, disable port done event will be sent 231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX); 232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) 232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bEnabled = OMX_FALSE; 233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Disable output Port command recieved m_state = %d", m_state); 233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_output_done()) 233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\ 233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting) 234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!sem_posted) 234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_posted = 1; 234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&m_cmd_lock); 234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX); 235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd); 236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNotImplemented; 236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eRet == OMX_ErrorNone && bFlag) 236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT); 236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!sem_posted) 236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post(&m_cmd_lock); 236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::ExecuteOmxFlush 237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Executes the OMX flush. 238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flushtype - input flush(1)/output flush(0)/ both. 238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::execute_omx_flush(OMX_U32 flushType) 238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_msginfo vdpp_msg; 239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("in %s flushType = %d", __func__, flushType); 239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&vdpp_msg,0,sizeof(vdpp_msg)); 239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (flushType) 240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CORE_INPUT_PORT_INDEX: 240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress = true; 240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CORE_OUTPUT_PORT_INDEX: 240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress = true; 240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress = true; 241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress = true; 241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp::execute_omx_flush m_ftb_q.m_size = %d, m_etb_q.m_size = %d\n", m_ftb_q.m_size, m_etb_q.m_size); 241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // vpu doesn't have flush right now, simulate flush done from here 241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef STUB_VPU 241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // dq output 241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(output_flush_progress) 242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgcode=VDPP_MSG_RESP_FLUSH_OUTPUT_DONE; 242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.status_code=VDPP_S_SUCCESS; 242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Simulate VDPP Output Flush Done Recieved From Driver\n"); 242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (async_message_process(this,&vdpp_msg) < 0) { 242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" VDPP Output Flush Done returns < 0 \n"); 242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // dq input 243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(input_flush_progress) 243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.msgcode=VDPP_MSG_RESP_FLUSH_INPUT_DONE; 243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg.status_code=VDPP_S_SUCCESS; 243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Simulate VDPP Input Flush Done Recieved From Driver \n"); 243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (async_message_process(this,&vdpp_msg) < 0) { 243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" VDPP Input Flush Done returns < 0 \n"); 243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // flush input port 244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(input_flush_progress) 244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(drv_ctx.video_vpu_fd, VPU_FLUSH_BUFS, &buf_type)) 244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VDPP input Flush error! \n"); 245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 245211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 245411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("VDPP input Flush success! \n"); 245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // flush output port 246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(output_flush_progress) 246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(drv_ctx.video_vpu_fd, VPU_FLUSH_BUFS, &buf_type)) 246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VDPP output Flush error! \n"); 246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("VDPP output Flush success! \n"); 247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*========================================================================= 247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_output_flush 248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Executes the OMX flush at OUTPUT PORT. 248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/ 249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::execute_output_flush() 249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p1 = 0; // Parameter - 1 249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p2 = 0; // Parameter - 2 249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned ident = 0; 249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = true; 249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Generate FBD for all Buffers in the FTBq*/ 249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Initiate Output Flush, m_ftb_q.m_size = %d", m_ftb_q.m_size); 250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_ftb_q.m_size) 250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Buffer queue size %d pending buf cnt %d", 250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.m_size,pending_output_buffers); 250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.pop_entry(&p1,&p2,&ident); 250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" ID(%x) P1(%x) P2(%x)", ident, p1, p2); 250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ident == m_fill_output_msg ) 250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (ident == OMX_COMPONENT_GENERATE_FBD) 251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress = false; 251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" OMX flush o/p Port complete PenBuf(%d), output_qbuf_count(%d), output_dqbuf_count(%d)", 251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers, output_qbuf_count, output_dqbuf_count); 252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*========================================================================= 252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_input_flush 252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Executes the OMX flush at INPUT PORT. 252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/ 253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::execute_input_flush() 253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i =0; 253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p1 = 0; // Parameter - 1 253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p2 = 0; // Parameter - 2 253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned ident = 0; 254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = true; 254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Generate EBD for all Buffers in the ETBq*/ 254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Initiate Input Flush \n"); 254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Check if the Queue is empty \n"); 254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_etb_q.m_size) 254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" m_etb_q.m_size = %d \n", m_etb_q.m_size); 255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.pop_entry(&p1,&p2,&ident); 255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ident = %d \n", ident); 255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) 255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(ident == OMX_COMPONENT_GENERATE_ETB) 255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers++; 256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (ident == OMX_COMPONENT_GENERATE_EBD) 256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Flush Input OMX_COMPONENT_GENERATE_EBD %p", 256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p1); 256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress = false; 257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = LLONG_MAX; 257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = true; 257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_timestamp) 258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.reset_ts_list(); 258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" OMX flush i/p Port complete PenBuf(%d), input_qbuf_count(%d), input_dqbuf_count(%d)", 258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers, input_qbuf_count, input_dqbuf_count); 258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::SendCommandEvent 259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Send the event to VDPP pipe. This is needed to generate the callbacks 259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel in VDPP thread context. 259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::post_event(unsigned int p1, 260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int p2, 260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int id) 260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("m_fill_output_msg = %d, OMX_COMPONENT_GENERATE_FBD = %d, id = %d", m_fill_output_msg, OMX_COMPONENT_GENERATE_FBD, id); 261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (id == m_fill_output_msg || 261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_FBD) 261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW(" post_event p2 = 0x%x, id = 0x%x", p2, id); 261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.insert_entry(p1,p2,id); 261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (id == OMX_COMPONENT_GENERATE_ETB || 262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_EBD || 262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) 262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.insert_entry(p1,p2,id); 262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cmd_q.insert_entry(p1,p2,id); 262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 263211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW(" Value of this pointer in post_event %p, id = %d",this, id); 263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_message(this, id); 263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::GetParameter 264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Get Parameter method implementation 264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Error None if successful. 265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::get_parameter(OMX_IN OMX_HANDLETYPE hComp, 265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE paramIndex, 265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_PTR paramData) 265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("get_parameter: \n"); 266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StateInvalid) 266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Param in Invalid State\n"); 266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(paramData == NULL) 266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n"); 266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_HIGH("get_parameter 1 : \n"); 267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch((unsigned long)paramIndex) 267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPortDefinition: 267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *portDefn = 267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n"); 267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = update_portdef(portDefn); 268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) 268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_def = *portDefn; 268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoInit: 268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *portParamType = 268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) paramData; 268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n"); 268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portParamType->nVersion.nVersion = OMX_SPEC_VERSION; 269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portParamType->nSize = sizeof(portParamType); 269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portParamType->nPorts = 2; 269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portParamType->nStartPortNumber = 0; 269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoPortFormat: 269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n"); 270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->nVersion.nVersion = OMX_SPEC_VERSION; 270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->nSize = sizeof(portFmt); 270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_CORE_INPUT_PORT_INDEX == portFmt->nPortIndex) 270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == portFmt->nIndex) 270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;//OMX_COLOR_FormatYUV420Planar;//OMX_COLOR_FormatUnused; 271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\ 271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " NoMore compression formats\n"); 271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (OMX_CORE_OUTPUT_PORT_INDEX == portFmt->nPortIndex) 272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(0 == portFmt->nIndex) 272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE) 272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\ 272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " NoMore Color formats\n"); 273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("returning %d\n", portFmt->eColorFormat); 273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n", 273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portFmt->nPortIndex); 273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Component should support this port definition*/ 274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamAudioInit: 274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *audioPortParamType = 274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) paramData; 274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n"); 274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel audioPortParamType->nSize = sizeof(audioPortParamType); 275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel audioPortParamType->nPorts = 0; 275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel audioPortParamType->nStartPortNumber = 0; 275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Component should support this port definition*/ 275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamImageInit: 275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *imagePortParamType = 275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) paramData; 275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n"); 276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel imagePortParamType->nSize = sizeof(imagePortParamType); 276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel imagePortParamType->nPorts = 0; 276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel imagePortParamType->nStartPortNumber = 0; 276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Component should support this port definition*/ 276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamOtherInit: 276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n", 277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedIndex; 277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamStandardComponentRole: 277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_COMPONENTROLETYPE *comp_role; 277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role->nVersion.nVersion = OMX_SPEC_VERSION; 278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role->nSize = sizeof(*comp_role); 278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n", 278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paramIndex); 278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)comp_role->cRole,(const char*)m_cRole, 278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE); 278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Added for parameter test */ 278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPriorityMgmt: 279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PRIORITYMGMTTYPE *priorityMgmType = 279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PRIORITYMGMTTYPE *) paramData; 279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n"); 279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION; 279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel priorityMgmType->nSize = sizeof(priorityMgmType); 279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Added for parameter test */ 280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamCompBufferSupplier: 280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = 280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n"); 280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->nSize = sizeof(bufferSupplierType); 280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION; 280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(OMX_CORE_INPUT_PORT_INDEX == bufferSupplierType->nPortIndex) 281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (OMX_CORE_OUTPUT_PORT_INDEX == bufferSupplierType->nPortIndex) 281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: 282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage"); 282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData; 282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((nativeBuffersUsage->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) || (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX)) 282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (MAX_RES_720P) 282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_CAMERA_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ION:720P: nUsage 0x%x",nativeBuffersUsage->nUsage); 283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_MM_HEAP; 283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ION:non_secure_mode: nUsage 0x%lx",nativeBuffersUsage->nUsage); 283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //(MAX_RES_720P) 283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else // USE_ION 283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (MAX_RES_720P) || defined (MAX_RES_1080P_EBI) 283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("720P/1080P_EBI: nUsage 0x%x",nativeBuffersUsage->nUsage); 284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#elif MAX_RES_1080P 284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_SMI_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("1080P: nUsage 0x%x",nativeBuffersUsage->nUsage); 284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // USE_ION 284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!"); 284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex); 285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedIndex; 285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" get_parameter returning input WxH(%d x %d) SxSH(%d x %d)\n", 286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.frame_width, 286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.frame_height, 286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.stride, 286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.scan_lines); 286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" get_parameter returning output WxH(%d x %d) SxSH(%d x %d)\n", 286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_width, 286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_height, 287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.stride, 287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.scan_lines); 287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data) 287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside use_android_native_buffer"); 288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data; 288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((params == NULL) || 288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (params->nativeBuffer == NULL) || 288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (params->nativeBuffer->handle == NULL) || 288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !m_enable_android_native_buffers) 288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_android_native_buffers = OMX_TRUE; 288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sp<android_native_buffer_t> nBuf = params->nativeBuffer; 289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = (private_handle_t *)nBuf->handle; 289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port 289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *buffer = NULL; 289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer = (OMX_U8*)mmap(0, handle->size, 289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(buffer == MAP_FAILED) { 289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer); 290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::Setparameter 291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Set Parameter method implementation. 291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if successful. 291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::set_parameter(OMX_IN OMX_HANDLETYPE hComp, 292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE paramIndex, 292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR paramData) 292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret=0; 292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int i = 0; 292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StateInvalid) 293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Param in Invalid State\n"); 293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(paramData == NULL) 293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n"); 293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((m_state != OMX_StateLoaded) && 294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) && 294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_out_bEnabled == OMX_TRUE) && 294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) && 294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_inp_bEnabled == OMX_TRUE)) { 294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Param in Invalid State \n"); 294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch((unsigned long)paramIndex) 294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPortDefinition: 295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n", 295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->format.video.nFrameHeight, 295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->format.video.nFrameWidth); 295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(OMX_CORE_OUTPUT_PORT_INDEX == portDefn->nPortIndex) 296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n"); 296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int buffer_size; 296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0, sizeof(fmt)); 296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // set output resolution based on port definition. scan_lines and stride settings need 296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // to match format setting requirement (QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) 296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" SetParam OP: WxH(%lu x %lu)\n", 297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth, 297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameHeight); 297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->format.video.nFrameHeight != 0x0 && 297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth != 0x0) 297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_height = portDefn->format.video.nFrameHeight; 297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_width = portDefn->format.video.nFrameWidth; 297711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.scan_lines = paddedFrameWidth32(portDefn->format.video.nFrameHeight); 297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.stride = paddedFrameWidth128(portDefn->format.video.nFrameWidth); 297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution_output.frame_height; 298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution_output.frame_width; 298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VP output frame width = %d, height = %d, drv_ctx.video_resolution_output.stride = %d, drv_ctx.video_resolution_output.scan_lines = %d", fmt.fmt.pix_mp.width, 298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height, drv_ctx.video_resolution_output.stride, drv_ctx.video_resolution_output.scan_lines); 298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // NV12 has 2 planes. 298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Set format for each plane. */ 298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setFormatParams(capture_capability, drv_ctx.output_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.output_bytesperpixel[i] * fmt.fmt.pix_mp.height); 299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].bytesperline = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.output_bytesperpixel[0]); // both plane have the same plane stride 299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("before VIDIOC_S_FMT (op) fmt.fmt.pix_mp.plane_fmt[%d].sizeimage = %d \n",i,fmt.fmt.pix_mp.plane_fmt[i].sizeimage); 299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("after VIDIOC_S_FMT (op) fmt.fmt.pix_mp.plane_fmt[%d].sizeimage = %d \n",i,fmt.fmt.pix_mp.plane_fmt[i].sizeimage); 300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) 300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Set Resolution failed"); 300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // eRet = get_buffer_req(&drv_ctx.ip_buf); 301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount /*|| 302111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferSize >= drv_ctx.op_buf.buffer_size*/ ) 302211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 302311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual; 302411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //drv_ctx.op_buf.buffer_size = portDefn->nBufferSize; 302511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_buffer_req(&drv_ctx.op_buf); 302611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) 302711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_def = *portDefn; 302811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 302911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 303011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 303111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)\n", 303211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size, 303311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual, portDefn->nBufferSize); 303411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 303511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 303611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 303711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(OMX_CORE_INPUT_PORT_INDEX == portDefn->nPortIndex) 303811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 303911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // TODO for 8092 the frame rate code below can be enabled to debug frame rate 304011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FRC_ENABLE 304111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((portDefn->format.video.xFramerate >> 16) > 0 && 304211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) 304311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 304411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Frame rate only should be set if this is a "known value" or to 304511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // activate ts prediction logic (arbitrary mode only) sending input 304611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // timestamps with max value (LLONG_MAX). 304711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu", 304811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.xFramerate >> 16); 304911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator, 305011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator); 305111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!drv_ctx.frame_rate.fps_numerator) 305211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 305311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 305411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = 30; 305511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 305611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.frame_rate.fps_denominator) 305711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = (int) 305811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 305911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator = 1; 306011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 306111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator; 306211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_parameter: frm_int(%lu) fps(%.2f)", 306311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int, drv_ctx.frame_rate.fps_numerator / 306411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (float)drv_ctx.frame_rate.fps_denominator); 306511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 306611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_outputparm oparm; 306711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*XXX: we're providing timing info as seconds per frame rather than frames 306811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * per second.*/ 306911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 307011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 307111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 307211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_streamparm sparm; 307311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sparm, 0, sizeof(struct v4l2_streamparm)); 307411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 307511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.parm.output = oparm; 307611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_PARM, &sparm)) { 307711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \ 307811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel performance might be affected"); 307911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 308011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 308111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 308211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 308311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0, sizeof(fmt)); 308411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n"); 308511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.video_resolution_input.frame_height != 308611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameHeight || 308711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.frame_width != 308811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth) 308911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 309011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" SetParam IP: WxH(%lu x %lu)\n", 309111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth, 309211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameHeight); 309311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->format.video.nFrameHeight != 0x0 && 309411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth != 0x0) 309511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 309611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel update_resolution(portDefn->format.video.nFrameWidth, 309711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (portDefn->format.video.nFrameHeight), 309811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nStride, 309911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (portDefn->format.video.nSliceHeight)); 310011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 310111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // decoder stride information is not used in S_FMT and QBUF, since paddedWidth 310211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // will ensure the buffer length/size is always aligned with 128 bytes, which 310311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // has the same effect as stride. 310411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // output has Width 720, and nStride = 768 310511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 310611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution_input.frame_height; 310711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution_input.frame_width; 310811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (V4L2_FIELD_NONE == drv_ctx.interlace) 310911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 311011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 311111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 311211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 311311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 311411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_INTERLACED; 311511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 311611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 311711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 311811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // NV12 has 2 planes. 311911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Set format for each plane. */ 312011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setFormatParams(output_capability, drv_ctx.input_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 312111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 312211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 312311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.input_bytesperpixel[i] * fmt.fmt.pix_mp.height); 312411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].bytesperline = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.input_bytesperpixel[0]); // both plane have the same plane stride 312511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("before VIDIOC_S_FMT (ip) fmt.fmt.pix_mp.plane_fmt[%d].sizeimage = %d \n",i,fmt.fmt.pix_mp.plane_fmt[i].sizeimage); 312611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 312711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 312811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 312911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 313011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 313111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // { 313211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_HIGH("after VIDIOC_S_FMT (ip) fmt.fmt.pix_mp.plane_fmt[%d].sizeimage = %d \n",i,fmt.fmt.pix_mp.plane_fmt[i].sizeimage); 313311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // } 313411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) 313511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 313611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Set Resolution failed"); 313711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 313811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 313911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 314011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 314111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 314211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("after VIDIOC_S_FMT (ip) drv_ctx.interlace = %d", drv_ctx.interlace); 314311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // set output resolution the same as input 314411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_height = portDefn->format.video.nFrameHeight; 314511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_width = portDefn->format.video.nFrameWidth; 314611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.scan_lines = paddedFrameWidth32(portDefn->format.video.nSliceHeight); 314711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.stride = paddedFrameWidth128(portDefn->format.video.nStride); 314811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 314911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 315011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution_output.frame_height; 315111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution_output.frame_width; 315211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 315311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 315411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VP output frame width = %d, height = %d, drv_ctx.video_resolution_output.stride = %d, drv_ctx.video_resolution_output.scan_lines = %d", fmt.fmt.pix_mp.width, 315511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height, drv_ctx.video_resolution_output.stride, drv_ctx.video_resolution_output.scan_lines); 315611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // NV12 has 2 planes. 315711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Set format for each plane. */ 315811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setFormatParams(capture_capability, drv_ctx.output_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 315911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 316011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 316111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.output_bytesperpixel[i] * fmt.fmt.pix_mp.height); 316211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].bytesperline = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.output_bytesperpixel[0]); // both plane have the same plane stride 316311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("before VIDIOC_S_FMT op fmt.fmt.pix_mp.plane_fmt[%d].sizeimage = %d \n",i,fmt.fmt.pix_mp.plane_fmt[i].sizeimage); 316411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 316511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 316611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel #ifndef STUB_VPU 316711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 316811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 316911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 317011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("after VIDIOC_S_FMT op fmt.fmt.pix_mp.plane_fmt[%d].sizeimage = %d \n",i,fmt.fmt.pix_mp.plane_fmt[i].sizeimage); 317111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 317211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 317311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) 317411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 317511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Set Resolution failed"); 317611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 317711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 317811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 317911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel #endif 318011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 318111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // get buffer req for input, output buffer size is 318211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // determined by output pixel format and output resolution 318311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //eRet = get_buffer_req(&drv_ctx.op_buf); 318411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.ip_buf); 318511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 318611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 318711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 318811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 318911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 319011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount 319111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*|| portDefn->nBufferSize >= drv_ctx.ip_buf.buffer_size*/) 319211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // only allocate larger size 319311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 319411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("portDefn->nBufferCountActual = %lu portDefn->nBufferSize = %lu, drv_ctx.ip_buf.buffer_size=%d \n", portDefn->nBufferCountActual, portDefn->nBufferSize, drv_ctx.ip_buf.buffer_size); 319511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_allocatorproperty *buffer_prop = &drv_ctx.ip_buf; 319611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual; 319711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //if(portDefn->nBufferSize >= drv_ctx.ip_buf.buffer_size) 319811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //{ 319911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) & 320011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // (~(buffer_prop->alignment - 1)); 320111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // DEBUG_PRINT_HIGH("drv_ctx.ip_buf.buffer_size = %d, buffer_prop->alignment = %d\n", drv_ctx.ip_buf.buffer_size, buffer_prop->alignment); 320211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //} 320311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_buffer_req(buffer_prop); 320411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 320511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 320611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 320711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)\n", 320811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size, 320911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual, portDefn->nBufferSize); 321011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 321111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 321211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 321311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (portDefn->eDir == OMX_DirMax) 321411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 321511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d", 321611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->nPortIndex); 321711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 321811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 321911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 322011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 322111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoPortFormat: 322211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 322311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 322411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 322511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret=0; 322611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 322711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n", 322811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat); 322911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 323011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(OMX_CORE_OUTPUT_PORT_INDEX == portFmt->nPortIndex) 323111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 323211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uint32_t op_format; 323311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 323411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0, sizeof(fmt)); 323511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 323611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution_output.frame_height; 323711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution_output.frame_width; 323811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 323911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 324011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // TODO based on output format 324111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // update OMX format type for additional output format supported by 8084 324211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 324311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) || 324411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar)) 324511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel op_format = (uint32_t)V4L2_PIX_FMT_NV12; 324611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(portFmt->eColorFormat == 324711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_COLOR_FORMATTYPE) 324811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_COLOR_FormatYVU420SemiPlanar) 324911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel op_format = V4L2_PIX_FMT_NV21; 325011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 325111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 325211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eRet == OMX_ErrorNone) 325411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 325511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_format = op_format; 325611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capture_capability = op_format; 325711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 325811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VP output frame width = %d, height = %d", fmt.fmt.pix_mp.width, 326011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height); 326111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 326211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setFormatParams(capture_capability, drv_ctx.output_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 326311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 326411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 326511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * 326611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_bytesperpixel[i] * 326711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height); 326811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].bytesperline = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.output_bytesperpixel[0]); 326911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 327011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 327111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 327211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ret) 327311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 327411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Set output format failed"); 327511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 327611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 327711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 327811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 327911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 328011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_buffer_req(&drv_ctx.op_buf); 328111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 328211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 328311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 328411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 328511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 328611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 328711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamStandardComponentRole: 328811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 328911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_COMPONENTROLETYPE *comp_role; 329011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 329111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n", 329211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role->cRole); 329311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 329411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((m_state == OMX_StateLoaded)&& 329511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 329611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 329711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set Parameter called in valid state"); 329811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 329911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 330011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 330111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n"); 330211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 330311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 330411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 330511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // no component role yet 330611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* if(!strncmp(drv_ctx.kind, "OMX.qcom.video.vidpp",OMX_MAX_STRINGNAME_SIZE)) 330711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 330811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!strncmp((char*)comp_role->cRole,"video.vidpp",OMX_MAX_STRINGNAME_SIZE)) 330911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 331011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)m_cRole,"video.vidpp",OMX_MAX_STRINGNAME_SIZE); 331111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 331211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 331311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 331411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 331511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedSetting; 331611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 331711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 331811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 331911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 332011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind); 332111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidComponentName; 332211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } */ 332311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 332411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 332511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 332611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPriorityMgmt: 332711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 332811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state != OMX_StateLoaded) 332911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 333011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n"); 333111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 333211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 333311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData; 333411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %lu\n", 333511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel priorityMgmtype->nGroupID); 333611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 333711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %lu\n", 333811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel priorityMgmtype->nGroupPriority); 333911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_priority_mgm.nGroupID = priorityMgmtype->nGroupID; 334111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority; 334211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 334411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 334511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamCompBufferSupplier: 334711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 334811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 334911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n", 335011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferSupplierType->eBufferSupplier); 335111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1) 335211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier; 335311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 335411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 335511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 335611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 335711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 335811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 335911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 336011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 336111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 336211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Need to allow following two set_parameters even in Idle 336311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * state. This is ANDROID architecture which is not in sync 336411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * with openmax standard. */ 336511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: 336611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 336711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData; 336811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(enableNativeBuffers) { 336911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_enable_android_native_buffers = enableNativeBuffers->enable; 337011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 337111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: enableNativeBuffers %d\n", m_enable_android_native_buffers); 337211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 337311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 337411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: 337511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 337611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = use_android_native_buffer(hComp, paramData); 337711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 337811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 337911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 338011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamInterlaceExtraData: 338111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, 338211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((QOMX_ENABLETYPE *)paramData)->bEnable); 338311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 338411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 338511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamInterlaceFormat: 338611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 338711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INTERLACEFORMATTYPE *interlaceFormat = ( OMX_INTERLACEFORMATTYPE *)paramData; 338811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamInterlaceFormat %ld\n", 338911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlaceFormat->nFormat); 339011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 339111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(OMX_InterlaceInterleaveFrameBottomFieldFirst == (OMX_U32)interlaceFormat->nFormat) 339211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 339311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = V4L2_FIELD_INTERLACED_BT; 339411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: V4L2_FIELD_INTERLACED_BT"); 339511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_user_flag = true; 339611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 339711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(OMX_InterlaceInterleaveFrameTopFieldFirst == (OMX_U32)interlaceFormat->nFormat) 339811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 339911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = V4L2_FIELD_INTERLACED_TB; 340011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: V4L2_FIELD_INTERLACED_TB"); 340111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_user_flag = true; 340211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 340311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(OMX_InterlaceFrameProgressive == (OMX_U32)interlaceFormat->nFormat) 340411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 340511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = V4L2_FIELD_NONE; 340611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_parameter: V4L2_FIELD_NONE"); 340711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_user_flag = true; 340811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 340911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 341011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 341111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown param %lu\n", interlaceFormat->nFormat); 341211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 341311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 341411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 341511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 341611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 341711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 341811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex); 341911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 342011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 342111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 342211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 342311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 342411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 342511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 342611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 342711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::GetConfig 342811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 342911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 343011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Get Config Method implementation. 343111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 343211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 343311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 343411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 343511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 343611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if successful. 343711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 343811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 343911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::get_config(OMX_IN OMX_HANDLETYPE hComp, 344011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE configIndex, 344111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_PTR configData) 344211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 344311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 344411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 344511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 344611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 344711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Config in Invalid State\n"); 344811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 344911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 345011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 345111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((unsigned long)configIndex) 345211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 345311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigCommonOutputCrop: 345411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 345511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData; 345611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE)); 345711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 345811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 345911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // OMX extensions 346111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigActiveRegionDetectionStatus: 346211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 346311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 346511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 346611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex); 346711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 346811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 346911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 347011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 347111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 347211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 347311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 347411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 347511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 347611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 347711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::SetConfig 347811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 347911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 348011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Set Config method implementation 348111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 348211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 348311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 348411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 348511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 348611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if successful. 348711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 348811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::set_config(OMX_IN OMX_HANDLETYPE hComp, 348911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE configIndex, 349011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR configData) 349111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 349211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 349311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vpu_control control; 349411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int result = 0; 349511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 349611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::set_config \n"); 349711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StateInvalid) 349811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 349911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Config in Invalid State\n"); 350011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 350111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 350211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 350311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((unsigned long)configIndex) 350411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 350511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // OMX extensions 350611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigActiveRegionDetection: 350711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 350811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vpu_ctrl_active_region_param *ard = &control.data.active_region_param; 350911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&control, 0, sizeof(control)); 351011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.control_id = VPU_CTRL_ACTIVE_REGION_PARAM; 351111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mExtensionData.activeRegionDetectionDirtyFlag = true; 351211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&(mExtensionData.activeRegionDetection), 351311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configData, 351411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(mExtensionData.activeRegionDetection)); 351511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 351611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Set control. */ 351711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ard->enable = mExtensionData.activeRegionDetection.bEnable; 351811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ard->num_exclusions = mExtensionData.activeRegionDetection.nNumExclusionRegions; 351911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&(ard->detection_region), &(mExtensionData.activeRegionDetection.sROI), sizeof(QOMX_RECTTYPE)); 352011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ard->num_exclusions > 0) 352111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 352211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&(ard->detection_region), &(mExtensionData.activeRegionDetection.sExclusionRegions), (ard->num_exclusions * sizeof(QOMX_RECTTYPE))); 352311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 352411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 352511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_ACTIVE_REGION_MEASURE : " 352611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "top %d left %d width %d height %d", 352711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ard->detection_region.top, ard->detection_region.left, 352811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ard->detection_region.width, ard->detection_region.height); 352911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 353011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel result = ioctl(drv_ctx.video_vpu_fd, VPU_S_CONTROL, &control); 353111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (result < 0) 353211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 353311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_S_CTRL VPU_S_CTRL_ACTIVE_REGION_MEASURE failed, result = %d", result); 353411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 353511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 353611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 353711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 353811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mExtensionData.activeRegionDetectionDirtyFlag = false; 353911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_ACTIVE_REGION_MEASURE set to: " 354011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "top %d left %d width %d height %d", 354111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ard->detection_region.top, ard->detection_region.left, 354211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ard->detection_region.width, ard->detection_region.height); 354311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 354411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 354511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 354611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 354711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 354811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigScalingMode: 354911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 355011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vpu_ctrl_standard *anmph = &control.data.standard; 355111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&control, 0, sizeof(control)); 355211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.control_id = VPU_CTRL_ANAMORPHIC_SCALING; 355311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mExtensionData.scalingModeDirtyFlag = true; 355411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&(mExtensionData.scalingMode), 355511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configData, 355611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(mExtensionData.scalingMode)); 355711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 355811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Set control. */ 355911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel anmph->enable = 1; 356011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel anmph->value = mExtensionData.scalingMode.eScaleMode; 356111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 356211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_ANAMORPHIC_SCALING %d, anmph->enable = %d", anmph->value, anmph->enable); 356311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 356411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel result = ioctl(drv_ctx.video_vpu_fd, VPU_S_CONTROL, &control); 356511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (result < 0) 356611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 356711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_S_CTRL VPU_S_CTRL_ANAMORPHIC_SCALING failed, result = %d", result); 356811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 356911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 357011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 357111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 357211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mExtensionData.scalingModeDirtyFlag = false; 357311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_ANAMORPHIC_SCALING set to %d", anmph->value); 357411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 357511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 357611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 357711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 357811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 357911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigNoiseReduction: 358011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 358111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vpu_ctrl_auto_manual *nr = &control.data.auto_manual; 358211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&control, 0, sizeof(control)); 358311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.control_id = VPU_CTRL_NOISE_REDUCTION; 358411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mExtensionData.noiseReductionDirtyFlag = true; 358511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&(mExtensionData.noiseReduction), 358611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configData, 358711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(mExtensionData.noiseReduction)); 358811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 358911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Set control. */ 359011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nr->enable = mExtensionData.noiseReduction.bEnable; 359111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nr->auto_mode = mExtensionData.noiseReduction.bAutoMode; 359211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nr->value = mExtensionData.noiseReduction.nNoiseReduction; 359311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 359411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_NOISE_REDUCTION %d, nr->enable = %d, nr->auto_mode = %d", nr->value, nr->enable, nr->auto_mode); 359511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 359611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel result = ioctl(drv_ctx.video_vpu_fd, VPU_S_CONTROL, &control); 359711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (result < 0) 359811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 359911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_S_CTRL VPU_S_CTRL_NOISE_REDUCTION failed, result = %d", result); 360011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 360111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 360211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 360311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 360411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mExtensionData.noiseReductionDirtyFlag = false; 360511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_NOISE_REDUCTION set to %d", nr->value); 360611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 360711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 360811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 360911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 361011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 361111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigImageEnhancement: 361211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 361311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vpu_ctrl_auto_manual *ie = &control.data.auto_manual; 361411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&control, 0, sizeof(control)); 361511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.control_id = VPU_CTRL_IMAGE_ENHANCEMENT; 361611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mExtensionData.imageEnhancementDirtyFlag = true; 361711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&(mExtensionData.imageEnhancement), 361811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configData, 361911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(mExtensionData.imageEnhancement)); 362011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Set control. */ 362211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ie->enable = mExtensionData.imageEnhancement.bEnable; 362311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ie->auto_mode = mExtensionData.imageEnhancement.bAutoMode; 362411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ie->value = mExtensionData.imageEnhancement.nImageEnhancement; 362511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_IMAGE_ENHANCEMENT %d, ie->enable = %d, ie->auto_mode = %d", ie->value, ie->enable, ie->auto_mode); 362711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 362811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel result = ioctl(drv_ctx.video_vpu_fd, VPU_S_CONTROL, &control); 362911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (result < 0) 363011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 363111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_S_CTRL VPU_S_CTRL_IMAGE_ENHANCEMENT failed, result = %d", result); 363211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 363311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 363411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 363511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 363611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mExtensionData.imageEnhancementDirtyFlag = false; 363711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_IMAGE_ENHANCEMENT set to %d", ie->value); 363811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 363911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 364011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 364111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 364211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FRC_ENABLE 364311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexVendorVideoFrameRate: 364411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 364511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 364611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData; 364711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX_IndexVendorVideoFrameRate %d", config->nFps); 364811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 364911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) { 365011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (config->bEnabled) { 365111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((config->nFps >> 16) > 0) { 365211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %d", 365311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel config->nFps >> 16); 365411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator, 365511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator); 365611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 365711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.frame_rate.fps_numerator) { 365811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 365911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = 30; 366011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 366111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 366211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.frame_rate.fps_denominator) { 366311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = (int) 366411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 366511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 366611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 366711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator = 1; 366811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 366911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator; 367011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 367111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_outputparm oparm; 367211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*XXX: we're providing timing info as seconds per frame rather than frames 367311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * per second.*/ 367411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 367511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 367611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 367711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_streamparm sparm; 367811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sparm, 0, sizeof(struct v4l2_streamparm)); 367911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 368011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.parm.output = oparm; 368111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 368211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_PARM, &sparm)) { 368311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \ 368411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel performance might be affected"); 368511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 368611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 368711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 368811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_set_fps = true; 368911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 369011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Frame rate not supported."); 369111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedSetting; 369211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 369311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 369411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate"); 369511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_set_fps = false; 369611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 369711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { // 8084 doesn't support FRC (only 8092 does). only input framerate setting is supported. 369811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d", 369911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)config->nPortIndex); 370011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 370111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 370211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 370311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 370411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 370511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 370611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigCallbackRequest: 370711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 370811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CONFIG_CALLBACKREQUESTTYPE *callbackRequest = (OMX_CONFIG_CALLBACKREQUESTTYPE *) configData; 370911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX_IndexConfigCallbackRequest %d", callbackRequest->bEnable); 371011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 371111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (callbackRequest->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) { 371211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((callbackRequest->bEnable) && (OMX_QcomIndexConfigActiveRegionDetectionStatus == (OMX_QCOM_EXTN_INDEXTYPE)callbackRequest->nIndex)) 371311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 371411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ar_callback_setup = true; 371511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 371611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 371711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 371811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 371911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigCommonOutputCrop: 372011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 372111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData; 372211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&rectangle, rect, sizeof(OMX_CONFIG_RECTTYPE)); 372311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 372411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 372511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 372611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 372711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("set_config: unknown param 0x%08x\n",configIndex); 372811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 372911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 373011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 373111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 373211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 373311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 373411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 373511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 373611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 373711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::GetExtensionIndex 373811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 373911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 374011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX GetExtensionIndex method implementaion. <TBD> 374111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 374211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 374311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 374411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 374511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 374611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 374711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 374811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 374911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::get_extension_index(OMX_IN OMX_HANDLETYPE hComp, 375011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_STRING paramName, 375111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_INDEXTYPE* indexType) 375211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 375311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::get_extension_index %s\n", paramName); 375411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StateInvalid) 375511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 375611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n"); 375711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 375811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 375911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 376011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) { 376111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 376211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX.google.android.index.enableAndroidNativeBuffers"); 376311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 376411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) { 376511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 376611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX.google.android.index.useAndroidNativeBuffer2"); 376711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 376811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) { 376911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName); 377011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 377111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX.google.android.index.useAndroidNativeBuffer"); 377211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 377311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) { 377411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 377511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("OMX.google.android.index.getAndroidNativeBufferUsage"); 377611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 377711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 377811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 377911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* VIDPP extension 378011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 378111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(!strncmp(paramName, 378211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_INDEX_CONFIG_ACTIVE_REGION_DETECTION_STATUS, 378311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_INDEX_CONFIG_ACTIVE_REGION_DETECTION_STATUS) - 1)) 378411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 378511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_extension_index OMX_QCOM_INDEX_CONFIG_ACTIVE_REGION_DETECTION_STATUS 0x%x \n", OMX_QcomIndexConfigActiveRegionDetectionStatus); 378611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigActiveRegionDetectionStatus; 378711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 378811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(!strncmp(paramName, 378911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_INDEX_CONFIG_ACTIVE_REGION_DETECTION, 379011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_INDEX_CONFIG_ACTIVE_REGION_DETECTION) - 1)) 379111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 379211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_extension_index OMX_QCOM_INDEX_CONFIG_ACTIVE_REGION_DETECTION 0x%x \n", OMX_QcomIndexConfigActiveRegionDetection); 379311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigActiveRegionDetection; 379411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 379511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(!strncmp(paramName, 379611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_INDEX_CONFIG_SCALING_MODE, 379711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_INDEX_CONFIG_SCALING_MODE) - 1)) 379811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 379911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_extension_index OMX_QCOM_INDEX_CONFIG_SCALING_MODE 0x%x \n", OMX_QcomIndexConfigScalingMode); 380011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigScalingMode; 380111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 380211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(!strncmp(paramName, 380311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_INDEX_CONFIG_NOISEREDUCTION, 380411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_INDEX_CONFIG_NOISEREDUCTION) - 1)) 380511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 380611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_extension_index OMX_QCOM_INDEX_CONFIG_NOISEREDUCTION 0x%x \n", OMX_QcomIndexConfigNoiseReduction); 380711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigNoiseReduction; 380811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 380911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(!strncmp(paramName, 381011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_INDEX_CONFIG_IMAGEENHANCEMENT, 381111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_QCOM_INDEX_CONFIG_IMAGEENHANCEMENT) - 1)) 381211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 381311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_extension_index OMX_QCOM_INDEX_CONFIG_IMAGEENHANCEMENT 0x%x \n", OMX_QcomIndexConfigImageEnhancement); 381411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigImageEnhancement; 381511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 381611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 381711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 381811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName); 381911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 382011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 382111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 382211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 382311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 382411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 382511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 382611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::GetState 382711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 382811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 382911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns the state information back to the caller.<TBD> 383011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 383111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 383211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 383311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 383411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 383511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Error None if everything is successful. 383611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 383711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::get_state(OMX_IN OMX_HANDLETYPE hComp, 383811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_STATETYPE* state) 383911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 384011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *state = m_state; 384111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state); 384211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 384311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 384411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 384511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 384611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 384711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::ComponentTunnelRequest 384811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 384911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 385011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Component Tunnel Request method implementation. <TBD> 385111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 385211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 385311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 385411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 385511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 385611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 385711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 385811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 385911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp, 386011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 386111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE peerComponent, 386211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 peerPort, 386311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup) 386411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 386511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n"); 386611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 386711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 386811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 386911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::use_output_buffer( 387011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 387111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 387211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 387311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 387411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 387511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 387611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 387711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 387811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 387911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i= 0; // Temporary counter 388011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_setbuffer_cmd setbuffers; 388111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR privateAppData = NULL; 388211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = NULL; 388311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *buff = buffer; 388411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 388511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 388611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 388711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 388811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Inside omx_vdpp::use_output_buffer buffer = %p, bytes= %lu", buffer, bytes); 388911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 389011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_out_mem_ptr) { 389111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers buffer = %p, bytes= %lu", buffer, bytes); 389211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_output_headers(); 389311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 389411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 389511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 389611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i=0; i< drv_ctx.op_buf.actualcount; i++) { 389711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_ABSENT(&m_out_bm_count,i)) 389811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 389911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 390011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 390111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 390211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 390311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 390411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(i >= drv_ctx.op_buf.actualcount) { 390511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Already using %d o/p buffers\n", drv_ctx.op_buf.actualcount); 390611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 390711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 390811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 390911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 391011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 391111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_enable_android_native_buffers) { 391211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Use_op_buf:m_enable_android_native_buffers 1\n"); 391311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_use_android_native_buffers) { 391411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Use_op_buf:m_enable_android_native_buffers 2\n"); 391511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 391611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sp<android_native_buffer_t> nBuf = params->nativeBuffer; 391711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)nBuf->handle; 391811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = params->pAppPrivate; 391911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 392011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Use_op_buf:m_enable_android_native_buffers 3\n"); 392111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)buff; 392211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = appData; 392311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 392411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 392511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!handle) { 392611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 392711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 392811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 392911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 393011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) { 393111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 393211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " expected %u, got %lu", 393311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size); 393411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 393511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 393611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 393711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_ICS_) 393811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[i].nativehandle = handle; 393911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_buffer[i].privatehandle = handle; 394011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 394111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd; 394211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].offset = 0; 394311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = NULL; 394411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 394511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size; 394611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Use_op_buf:m_enable_android_native_buffers 5 drv_ctx.ptr_outputbuffer[i].bufferaddr = %p, size1=%d, size2=%d\n", 394711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr, 394811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size, 394911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle->size); 395011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 395111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 395211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 395311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ouput_egl_buffers && !m_use_output_pmem) { 395411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 395511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 395611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment, 395711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.op_buf_ion_info[i].ion_alloc_data, 395811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.op_buf_ion_info[i].fd_ion_data, 0); 395911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) { 396011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION device fd is bad %d\n", drv_ctx.op_buf_ion_info[i].ion_device_fd); 396111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 396211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 396311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 396411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 396511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 396611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 396711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel open (MEM_DEVICE,O_RDWR); 396811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 396911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 397011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd); 397111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 397211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 397311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 397411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd, 397511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size, 397611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.alignment)) 397711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 397811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" align_pmem_buffers() failed"); 397911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 398011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 398111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 398211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 398311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 398411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = 398511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size, 398611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, 398711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd,0); 398811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) { 398911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 399011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 399111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 399211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 399311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unable to mmap output buffer\n"); 399411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 399511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 399611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 399711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].offset = 0; 399811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = appData; 399911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 400011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 400111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 400211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem); 400311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!appData || !bytes ) { 400411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!buffer) { 400511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Bad parameters for use buffer in EGL image case"); 400611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 400711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 400811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 400911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 401011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list; 401111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info; 401211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData; 401311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pmem_list || !pmem_list->entryList || !pmem_list->entryList->entry || 401411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !pmem_list->nEntries || 401511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 401611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Pmem info not valid in use buffer"); 401711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 401811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 401911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 402011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_list->entryList->entry; 402111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx", 402211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_info->pmem_fd); 402311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd; 402411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset; 402511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 402611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].mmaped_size = 402711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 402811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = appData; 402911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 403011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 403111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_out_mem_ptr + i ); 403211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 403311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i], 403411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof (vdpp_bufferpayload)); 403511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 403611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i, 403711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr, 403811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd ); 403911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 404011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("use_output_buffer: i = %d, streaming[CAPTURE_PORT] = %d ", i, streaming[CAPTURE_PORT]); 404111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // stream on output port 404211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) { 404311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 404411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 404511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_vpu_fd, VIDIOC_STREAMON,&buf_type)) { 404611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE STREAMON failed \n "); 404711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 404811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 404911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = true; 405011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE STREAMON Successful \n "); 405111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 405211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 405311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 405411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 405511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size; 405611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) { 405711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle); 405811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = (OMX_U8 *)handle; 405911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 406011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = buff; 406111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 406211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pAppPrivate = privateAppData; 406311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_out_bm_count,i); 406411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 406511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 406611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 406711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 406811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 406911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 407011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 407111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::use_input_heap_buffers 407211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 407311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 407411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Use Buffer Heap allocation method implementation. 407511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 407611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 407711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 407811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 407911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 408011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None , if everything successful. 408111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 408211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 408311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::use_input_heap_buffers( 408411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 408511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 408611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 408711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 408811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 408911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 409011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 409111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR privateAppData = NULL; 409211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 409311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = NULL; 409411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 409511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *buff = buffer; 409611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 409711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer); 409811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 409911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!m_inp_heap_ptr) 410011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 410111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside %s 0, %p\n", __FUNCTION__, buffer); 410211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 410311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 410411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 410511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 410611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 410711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!m_phdr_pmem_ptr) 410811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 410911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside %s 0-1, %p\n", __FUNCTION__, buffer); 411011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 411111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 411211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 411311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 411411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!m_inp_heap_ptr || !m_phdr_pmem_ptr) 411511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 411611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Insufficent memory"); 411711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 411811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 411911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) 412011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 412111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside %s 2 m_in_alloc_cnt = %lu, drv_ctx.ip_buf.actualcount = %d\n", __FUNCTION__, m_in_alloc_cnt, drv_ctx.ip_buf.actualcount); 412211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer = true; 412311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 412411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // update this buffer for native window buffer in etb 412511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // OMXNodeInstance::useGraphicBuffer2_l check if pBuffer and pAppPrivate are 412611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // the same value as passed in. If not, useGraphicBuffer2_l will exit on error 412711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // 412811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 412911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 413011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 413111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 413211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 413311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // save mmapped native window buffer address to pPlatformPrivate 413411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // use this mmaped buffer address in etb_proxy 413511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 413611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*if(m_enable_android_native_buffers) */{ 413711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_use_android_native_buffers) { 413811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 413911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sp<android_native_buffer_t> nBuf = params->nativeBuffer; 414011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)nBuf->handle; 414111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = params->pAppPrivate; 414211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 414311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)buff; 414411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = appData; 414511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::use_input_heap_buffers 3\n"); 414611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 414711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 414811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!handle) { 414911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 415011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 415111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 415211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 415311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((OMX_U32)handle->size < drv_ctx.ip_buf.buffer_size) { 415411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 415511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " expected %u, got %lu", 415611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size, (OMX_U32)handle->size); 415711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 415811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 415911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 416011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_use_android_native_buffers) { 416111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buff = (OMX_U8*)mmap(0, handle->size, 416211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 416311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::use_input_heap_buffers 4 buff = %p\n", buff); 416411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buff == MAP_FAILED) { 416511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 416611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 416711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 416811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 416911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // we only need to copy this buffer (read only), no need to preserver this handle 417011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // this handle is saved for write-unlock in use_output_buffer case 417111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_ICS_) 417211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //native_buffer[i].nativehandle = handle; 417311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //native_buffer[i].privatehandle = handle; 417411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 417511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].pPlatformPrivate = buff; 417611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::use_input_heap_buffers 5 m_inp_heap_ptr = %p, m_inp_heap_ptr[%lu].pPlatformPrivate = %p, m_inp_heap_ptr[%lu].pBuffer = %p\n", 417711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // m_inp_heap_ptr, m_in_alloc_cnt, m_inp_heap_ptr[m_in_alloc_cnt].pPlatformPrivate, m_in_alloc_cnt, m_inp_heap_ptr[m_in_alloc_cnt].pBuffer); 417811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 417911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 418011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 418111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // user passes buffer in, but we need ION buffer 418211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("Inside %s 6 *bufferHdr = %p, byts = %lu \n", __FUNCTION__, *bufferHdr, bytes); 418311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes); 418411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]); 418511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], 418611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL, (unsigned)NULL)) 418711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 418811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 418911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 419011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 419111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_in_alloc_cnt++; 419211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 419311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 419411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 419511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("All i/p buffers have been set! m_in_alloc_cnt = %lu, drv_ctx.ip_buf.actualcount = %d", m_in_alloc_cnt, drv_ctx.ip_buf.actualcount); 419611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 419711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 419811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 419911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 420011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 420311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 420411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::use_input_buffers 420511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 420711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Use Buffer method implementation. 420811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 421011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 421111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 421211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 421311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None , if everything successful. 421411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 421511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 421611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::use_input_buffers( 421711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 421811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 421911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 422011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 422111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 422211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 422311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 422411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR privateAppData = NULL; 422511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *input = NULL; 422611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 422711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = NULL; 422811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 422911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *buff = buffer; 423011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int i = 0; 423111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 423211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer); 423311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 423411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 423511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!m_inp_heap_ptr) 423611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 423711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside %s 0, %p\n", __FUNCTION__, buffer); 423811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 423911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 424011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 424111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 424211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 424311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!m_phdr_pmem_ptr) 424411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 424511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside %s 0-1, %p\n", __FUNCTION__, buffer); 424611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 424711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 424811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 424911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 425011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 425111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!m_inp_heap_ptr || !m_phdr_pmem_ptr) 425211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 425311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Insufficent memory"); 425411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 425511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 425611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) 425711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 425811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside %s 2 m_in_alloc_cnt = %lu, drv_ctx.ip_buf.actualcount = %d\n", __FUNCTION__, m_in_alloc_cnt, drv_ctx.ip_buf.actualcount); 425911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer = true; 426011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 426111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // update this buffer for native window buffer in etb 426211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // OMXNodeInstance::useGraphicBuffer2_l check if pBuffer and pAppPrivate are 426311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // the same value as passed in. If not, useGraphicBuffer2_l will exit on error 426411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // 426511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 426611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 426711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 426811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 426911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 427011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // save mmapped native window buffer address to pPlatformPrivate 427111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // use this mmaped buffer address in etb_proxy 427211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 427311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*if(m_enable_android_native_buffers) */{ 427411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_use_android_native_buffers) { 427511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 427611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sp<android_native_buffer_t> nBuf = params->nativeBuffer; 427711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)nBuf->handle; 427811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = params->pAppPrivate; 427911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 428011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)buff; 428111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel privateAppData = appData; 428211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::use_input_heap_buffers 3\n"); 428311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 428411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 428511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!handle) { 428611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 428711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 428811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 428911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 429011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((OMX_U32)handle->size < drv_ctx.ip_buf.buffer_size) { 429111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 429211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " expected %u, got %lu", 429311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size, (OMX_U32)handle->size); 429411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 429511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 429611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 429711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_use_android_native_buffers) { 429811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buff = (OMX_U8*)mmap(0, (handle->size - drv_ctx.ip_buf.frame_size), 429911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, drv_ctx.ip_buf.frame_size); 430011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 430111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::use_input_heap_buffers 4 buff = %p, size1=%d, size2=%d\n", buff, 430211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size, 430311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle->size); 430411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buff == MAP_FAILED) { 430511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 430611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 430711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 430811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 430911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // we only need to copy this buffer (read only), no need to preserver this handle 431011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // this handle is saved for write-unlock in use_output_buffer case 431111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_ICS_) 431211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //native_buffer[i].nativehandle = handle; 431311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //native_buffer[i].privatehandle = handle; 431411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 431511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr[m_in_alloc_cnt].pPlatformPrivate = buff; 431611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::use_input_heap_buffers 5 m_inp_heap_ptr = %p, m_inp_heap_ptr[%lu].pPlatformPrivate = %p, m_inp_heap_ptr[%lu].pBuffer = %p\n", 431711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // m_inp_heap_ptr, m_in_alloc_cnt, m_inp_heap_ptr[m_in_alloc_cnt].pPlatformPrivate, m_in_alloc_cnt, m_inp_heap_ptr[m_in_alloc_cnt].pBuffer); 431811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 431911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 432011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 432111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 432211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!m_inp_mem_ptr) 432311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 432411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Allocate i/p buffer Header: Cnt(%d) Sz(%d)", 432511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount, 432611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size); 432711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 432811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 432911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 433011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 433111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr == NULL) 433211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 433311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 433411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 433511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 433611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer = (struct vdpp_bufferpayload *) \ 433711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc ((sizeof (struct vdpp_bufferpayload)),drv_ctx.ip_buf.actualcount); 433811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 433911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_inputbuffer == NULL) 434011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 434111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 434211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 434311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 434411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 434511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i=0; i< drv_ctx.ip_buf.actualcount; i++) 434611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 434711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_ABSENT(&m_inp_bm_count,i)) 434811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 434911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free Input Buffer Index %d",i); 435011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 435111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 435211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 435311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 435411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(i < drv_ctx.ip_buf.actualcount) 435511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 435611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 435711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane; 435811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 435911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 436011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr[m_in_alloc_cnt] = (m_inp_mem_ptr + i); 436111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 436211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].bufferaddr = buff; 436311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].pmem_fd = handle->fd; 436411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 436511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].mmaped_size = handle->size - drv_ctx.ip_buf.frame_size; 436611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].offset = 0; 436711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 436811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input = m_phdr_pmem_ptr[m_in_alloc_cnt]; 436911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_inp_bm_count,i); 437011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer Buffer address %p of pmem",*bufferHdr); 437111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 437211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pBuffer = (OMX_U8 *)buff; 437311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 437411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nVersion.nVersion = OMX_SPEC_VERSION; 437511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nAllocLen = drv_ctx.ip_buf.buffer_size; 437611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pAppPrivate = appData; 437711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 437811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; // used in empty_this_buffer_proxy 437911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 438011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer input->pBuffer %p of pmem, input->pInputPortPrivate = %p",input->pBuffer, input->pInputPortPrivate); 438111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer memset drv_ctx.ip_buf.buffer_size = %d\n", drv_ctx.ip_buf.buffer_size); 438211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 438311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 438411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 438511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 438611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found"); 438711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 438811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 438911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 439011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], 439111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL, (unsigned)NULL)) 439211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 439311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 439411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 439511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 439611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_in_alloc_cnt++; 439711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 439811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 439911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 440011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("All i/p buffers have been set! m_in_alloc_cnt = %lu, drv_ctx.ip_buf.actualcount = %d", m_in_alloc_cnt, drv_ctx.ip_buf.actualcount); 440111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 440211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 440311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 440411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 440511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 440611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 440711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 440811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::UseBuffer 440911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 441011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 441111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Use Buffer method implementation. 441211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 441311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 441411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 441511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 441611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 441711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None , if everything successful. 441811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 441911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 442011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::use_buffer( 442111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 442211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 442311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 442411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 442511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 442611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 442711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 442811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE error = OMX_ErrorNone; 442911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_setbuffer_cmd setbuffers; 443011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 443111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((bufferHdr == NULL) || (bytes == 0) || (/*!secure_mode && */buffer == NULL)) 443211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 443311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer); 443411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 443511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 443611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StateInvalid) 443711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 443811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n"); 443911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 444011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 444111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(port == OMX_CORE_INPUT_PORT_INDEX) 444211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer); 444311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel error = use_input_buffers(hComp, bufferHdr, port, appData, bytes, buffer); // option to use vdec buffer 444411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 444511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(port == OMX_CORE_OUTPUT_PORT_INDEX) 444611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); 444711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 444811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 444911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port); 445011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel error = OMX_ErrorBadPortIndex; 445111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 445211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Use Buffer: port %lu, buffer %p, eRet %d", port, *bufferHdr, error); 445311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(error == OMX_ErrorNone) 445411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 445511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 445611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 445711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 445811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 445911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandStateSet,OMX_StateIdle, 446011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 446111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 446211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated && 446311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) 446411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 446511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 446611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 446711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX, 446811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 446911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 447011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated && 447111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) 447211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 447311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 447411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 447511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, 447611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 447711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 447811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 447911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Use Buffer error = %d", error); 448011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return error; 448111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 448211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 448311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 448411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 448511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = 0; 448611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL || m_inp_mem_ptr == NULL) 448711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 448811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 448911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 449011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 449111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufferHdr - m_inp_mem_ptr; 449211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 449311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // decrease m_in_alloc_cnt so use_input_heap_buffer can be called 449411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // again after port re-enable 449511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_in_alloc_cnt--; 449611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("free_input_buffer Free Input Buffer index = %d, m_in_alloc_cnt = %lu",index, m_in_alloc_cnt); 449711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 449811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) { 449911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Input ION Buffer index = %d",index); 450011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) { 450111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_setbuffer_cmd setbuffers; 450211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setbuffers.buffer_type = VDPP_BUFFER_TYPE_INPUT; 450311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index], 450411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof (vdpp_bufferpayload)); 450511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 450611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" unmap the input buffer fd=%d", 450711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].pmem_fd); 450811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" unmap the input buffer size=%d address = %p", 450911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].mmaped_size, 451011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].bufferaddr); 451111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr, 451211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].mmaped_size); 451311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 451411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 451511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // If drv_ctx.ip_buf_ion_info is NULL then ION buffer is passed from upper layer. 451611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // don't close fd and free this buffer, leave upper layer close and free this buffer 451711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer[index].pmem_fd = -1; 451811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.ip_buf_ion_info != NULL) 451911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 452011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close (drv_ctx.ptr_inputbuffer[index].pmem_fd); 452111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel #ifdef USE_ION 452211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.ip_buf_ion_info[index]); 452311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel #endif 452411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 452511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 452611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 452711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 452811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 452911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 453011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 453111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 453211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 453311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = 0; 453411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 453511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL || m_out_mem_ptr == NULL) 453611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 453711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 453811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 453911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 454011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufferHdr - m_out_mem_ptr; 454111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free output Buffer index = %d",index); 454211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 454311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < drv_ctx.op_buf.actualcount 454411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && drv_ctx.ptr_outputbuffer) 454511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 454611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free output Buffer index = %d addr = %p", index, 454711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].bufferaddr); 454811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 454911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_setbuffer_cmd setbuffers; 455011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setbuffers.buffer_type = VDPP_BUFFER_TYPE_OUTPUT; 455111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index], 455211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof (vdpp_bufferpayload)); 455311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 455411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_enable_android_native_buffers) { 455511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free output Buffer android pmem_fd=%d", drv_ctx.ptr_outputbuffer[index].pmem_fd); 455611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) { 455711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free output Buffer android 2 bufferaddr=%p, mmaped_size=%d", 455811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].bufferaddr, 455911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].mmaped_size); 456011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if( NULL != drv_ctx.ptr_outputbuffer[index].bufferaddr) 456111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 456211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr, 456311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].mmaped_size); 456411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 456511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 456611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 456711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 456811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 456911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) 457011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 457111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 457211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" unmap the output buffer fd = %d", 457311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].pmem_fd); 457411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" unmap the ouput buffer size=%d address = %p", 457511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].mmaped_size * drv_ctx.op_buf.actualcount, 457611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].bufferaddr); 457711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap (drv_ctx.ptr_outputbuffer[index].bufferaddr, 457811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].mmaped_size * drv_ctx.op_buf.actualcount); 457911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 458011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close (drv_ctx.ptr_outputbuffer[index].pmem_fd); 458111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 458211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 458311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.op_buf_ion_info[index]); 458411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 458511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 458611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 458711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 458811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 458911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_output_done()) { 459011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //free_extradata(); 459111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 459211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 459311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 459411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 459511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 459611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 459711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 459811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 459911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE **bufferHdr, 460011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 port, 460111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR appData, 460211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 bytes) 460311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 460411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *input = NULL; 460511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *buf_addr = NULL; 460611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 460711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 460811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 460911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Sanity Check*/ 461011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL) 461111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 461211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 461311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 461411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 461511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_heap_ptr == NULL) 461611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 461711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \ 461811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 461911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 462011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \ 462111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 462211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount); 462311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 462411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_inp_heap_ptr == NULL) || (m_phdr_pmem_ptr == NULL)) 462511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 462611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" m_inp_heap_ptr Allocation failed "); 462711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 462811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 462911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 463011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 463111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Find a Free index*/ 463211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i=0; i< drv_ctx.ip_buf.actualcount; i++) 463311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 463411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_ABSENT(&m_heap_inp_bm_count,i)) 463511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 463611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free Input Buffer Index %d",i); 463711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 463811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 463911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 464011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 464111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < drv_ctx.ip_buf.actualcount) 464211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 464311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size); 464411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 464511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_addr == NULL) 464611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 464711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 464811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 464911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 465011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_inp_heap_ptr + i); 465111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input = *bufferHdr; 465211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_heap_inp_bm_count,i); 465311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 465411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pBuffer = (OMX_U8 *)buf_addr; 465511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 465611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nVersion.nVersion = OMX_SPEC_VERSION; 465711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nAllocLen = drv_ctx.ip_buf.buffer_size; 465811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pAppPrivate = appData; 465911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 466011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Address of Heap Buffer %p",*bufferHdr ); 466111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes); 466211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]); 466311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Add the Buffers to freeq*/ 466411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i], 466511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL, (unsigned)NULL)) 466611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 466711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 466811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 466911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 467011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 467111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 467211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 467311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 467411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 467511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 467611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 467711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 467811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 467911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 468011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 468111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 468211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::AllocateInputBuffer 468311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 468411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 468511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Helper function for allocate buffer in the input pin 468611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 468711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 468811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 468911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 469011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 469111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 469211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 469311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 469411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::allocate_input_buffer( 469511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 469611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 469711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 469811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 469911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes) 470011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 470111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 470211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 470311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_setbuffer_cmd setbuffers; 470411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *input = NULL; 470511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 470611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *buf_addr = NULL; 470711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pmem_fd = -1; 470811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 470911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(bytes != drv_ctx.ip_buf.buffer_size) 471011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 471111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Requested Size is wrong %lu expected is %d", 471211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes, drv_ctx.ip_buf.buffer_size); 471311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 471411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 471511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 471611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!m_inp_mem_ptr) 471711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 471811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Allocate i/p buffer Header: Cnt(%d) Sz(%d)", 471911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.actualcount, 472011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size); 472111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 472211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 472311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 472411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 472511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr == NULL) 472611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 472711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 472811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 472911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 473011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer = (struct vdpp_bufferpayload *) \ 473111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc ((sizeof (struct vdpp_bufferpayload)),drv_ctx.ip_buf.actualcount); 473211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 473311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_inputbuffer == NULL) 473411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 473511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 473611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 473711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 473811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf_ion_info = (struct vdpp_ion *) \ 473911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc ((sizeof (struct vdpp_ion)),drv_ctx.ip_buf.actualcount); 474011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 474111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ip_buf_ion_info == NULL) 474211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 474311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 474411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 474511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 474611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 474711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i < drv_ctx.ip_buf.actualcount; i++) 474811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 474911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].pmem_fd = -1; 475011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 475111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1; 475211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 475311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 475411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 475511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 475611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i=0; i< drv_ctx.ip_buf.actualcount; i++) 475711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 475811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_ABSENT(&m_inp_bm_count,i)) 475911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 476011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free Input Buffer Index %d",i); 476111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 476211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 476311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 476411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 476511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(i < drv_ctx.ip_buf.actualcount) 476611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 476711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 476811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane; 476911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 477011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer Allocate input Buffer, drv_ctx.ip_buf.buffer_size = %d", drv_ctx.ip_buf.buffer_size); 477111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 477211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 477311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment, 477411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.ip_buf_ion_info[i].ion_alloc_data, 477511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.ip_buf_ion_info[i].fd_ion_data, 0); 477611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) { 477711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 477811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 477911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd; 478011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 478111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 478211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 478311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_addr = (unsigned char *)mmap(NULL, 478411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf.buffer_size, 478511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0); 478611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 478711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_addr == MAP_FAILED) 478811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 478911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd); 479011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 479111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.ip_buf_ion_info[i]); 479211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 479311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Map Failed to allocate input buffer"); 479411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 479511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 479611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 479711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_inp_mem_ptr + i); 479811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 479911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr; 480011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd; 480111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 480211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size; 480311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer [i].offset = 0; 480411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 480511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input = *bufferHdr; 480611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_inp_bm_count,i); 480711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer Buffer address %p of pmem",*bufferHdr); 480811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 480911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pBuffer = (OMX_U8 *)buf_addr; 481011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 481111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nVersion.nVersion = OMX_SPEC_VERSION; 481211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nAllocLen = drv_ctx.ip_buf.buffer_size; 481311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pAppPrivate = appData; 481411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 481511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; // used in empty_this_buffer_proxy 481611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 481711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer input->pBuffer %p of pmem, input->pInputPortPrivate = %p",input->pBuffer, input->pInputPortPrivate); 481811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(buf_addr, 0, drv_ctx.ip_buf.buffer_size); 481911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer memset drv_ctx.ip_buf.buffer_size = %d\n", drv_ctx.ip_buf.buffer_size); 482011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 482111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 482211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 482311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found"); 482411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 482511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 482611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 482711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 482811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 482911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 483011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 483111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 483211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::AllocateOutputBuffer 483311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 483411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 483511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Helper fn for AllocateBuffer in the output pin 483611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 483711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 483811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 483911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 484011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 484111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything went well. 484211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 484311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 484411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::allocate_output_buffer( 484511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 484611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 484711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 484811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 484911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes) 485011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 485111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 485211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 485311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i= 0; // Temporary counter 485411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_setbuffer_cmd setbuffers; 485511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 485611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 485711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ion_device_fd =-1; 485811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_allocation_data ion_alloc_data; 485911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_fd_data fd_ion_data; 486011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 486111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!m_out_mem_ptr) 486211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 486311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Allocate o/p buffer Header: Cnt(%d) Sz(%d)", 486411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount, 486511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size); 486611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nBufHdrSize = 0; 486711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pmem_fd = -1; 486811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *pmem_baseaddress = NULL; 486911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 487011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n", 487111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 487211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufHdrSize = drv_ctx.op_buf.actualcount * 487311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_BUFFERHEADERTYPE); 487411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 487511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_device_fd = alloc_map_ion_memory( 487611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount, 487711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.alignment, 487811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &ion_alloc_data, &fd_ion_data, 0); 487911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ion_device_fd < 0) { 488011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 488111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 488211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = fd_ion_data.fd; 488311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 488411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 488511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 488611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_baseaddress = (unsigned char *)mmap(NULL, 488711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.op_buf.buffer_size * 488811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount), 488911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0); 489011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_baseaddress == MAP_FAILED) 489111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 489211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" MMAP failed for Size %d", 489311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size); 489411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd); 489511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 489611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 489711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 489811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 489911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 490011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 490111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 490211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 490311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 490411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = (struct vdpp_bufferpayload *)\ 490511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct vdpp_bufferpayload), 490611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 490711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = (struct vdpp_output_frameinfo *)\ 490811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof (struct vdpp_output_frameinfo), 490911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 491011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 491111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = (struct vdpp_ion *)\ 491211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct vdpp_ion), 491311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 491411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 491511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.op_buf_ion_info) { 491611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info"); 491711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 491811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 491911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 492011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 492111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_out_mem_ptr /*&& pPtr*/ && drv_ctx.ptr_outputbuffer 492211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && drv_ctx.ptr_respbuffer) 492311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 492411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[0].mmaped_size = 492511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (drv_ctx.op_buf.buffer_size * 492611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 492711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr = m_out_mem_ptr; 492811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 492911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr); 493011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 493111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i=0; i < drv_ctx.op_buf.actualcount ; i++) 493211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 493311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 493411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 493511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Set the values when we determine the right HxW param 493611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nAllocLen = bytes; 493711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nFilledLen = 0; 493811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pAppPrivate = appData; 493911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 494011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pBuffer = NULL; 494111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nOffset = 0; 494211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 494311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd; 494411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 494511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd; 494611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data; 494711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data; 494811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 494911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 495011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Create a mapping between buffers*/ 495111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 495211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer[i].client_data = (void *)\ 495311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.ptr_outputbuffer[i]; 495411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i; 495511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr = 495611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i); 495711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 495811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" pmem_fd = %d offset = %d address = %p", 495911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd, drv_ctx.ptr_outputbuffer[i].offset, 496011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].bufferaddr); 496111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Move the buffer and buffer header pointers 496211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr++; 496311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 496411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 496511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 496611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 496711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 496811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_out_mem_ptr) 496911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 497011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_out_mem_ptr); 497111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = NULL; 497211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 497311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 497411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.ptr_outputbuffer) 497511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 497611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ptr_outputbuffer); 497711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = NULL; 497811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 497911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.ptr_respbuffer) 498011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 498111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ptr_respbuffer); 498211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = NULL; 498311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 498411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 498511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.op_buf_ion_info) { 498611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free o/p ion context"); 498711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.op_buf_ion_info); 498811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = NULL; 498911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 499011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 499111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 499211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 499311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 499411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 499511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i=0; i< drv_ctx.op_buf.actualcount; i++) 499611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 499711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_ABSENT(&m_out_bm_count,i)) 499811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 499911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Found a Free Output Buffer %d",i); 500011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 500111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 500211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 500311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 500411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) 500511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 500611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(i < drv_ctx.op_buf.actualcount) 500711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 500811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 500911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 501011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 501111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 501211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].buffer_len = 501311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.buffer_size; 501411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 501511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_out_mem_ptr + i ); 501611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size; 501711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 501811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 501911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) { 502011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 502111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 502211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc=ioctl(drv_ctx.video_vpu_fd, VIDIOC_STREAMON,&buf_type); 502311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 502411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("allocate_output_buffer STREAMON failed \n "); 502511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 502611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 502711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = true; 502811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("allocate_output_buffer STREAMON Successful \n "); 502911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 503011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 503111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 503211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 503311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr; 503411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pAppPrivate = appData; 503511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_out_bm_count,i); 503611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 503711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 503811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 503911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n"); 504011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 504111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 504211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 504311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 504411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 504511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 504611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 504711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 504811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// AllocateBuffer -- API Call 504911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 505011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 505111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::AllocateBuffer 505211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 505311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 505411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns zero if all the buffers released.. 505511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 505611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 505711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 505811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 505911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 506011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 506111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 506211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 506311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp, 506411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 506511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 506611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 506711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes) 506811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 506911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 507011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type 507111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 507211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Allocate buffer on port %d \n", (int)port); 507311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StateInvalid) 507411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 507511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n"); 507611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 507711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 507811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 507911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(port == OMX_CORE_INPUT_PORT_INDEX) 508011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 508111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_heap_buffer(hComp,bufferHdr,port,appData,bytes); 508211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 508311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(port == OMX_CORE_OUTPUT_PORT_INDEX) 508411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 508511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_output_buffer(hComp,bufferHdr,port,appData,bytes); 508611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 508711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 508811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 508911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port); 509011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 509111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 509211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done"); 509311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eRet == OMX_ErrorNone) 509411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 509511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(allocate_done()){ 509611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 509711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 509811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 509911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 510011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandStateSet,OMX_StateIdle, 510111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 510211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 510311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 510411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) 510511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 510611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) 510711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 510811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 510911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 511011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX, 511111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 511211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 511311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 511411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) 511511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 511611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) 511711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 511811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 511911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 512011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, 512111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 512211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 512311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 512411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 512511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet); 512611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 512711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 512811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 512911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Free Buffer - API call 513011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 513111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 513211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::FreeBuffer 513311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 513411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 513511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 513611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 513711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 513811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 513911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 514011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 514111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 514211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 514311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::free_buffer(OMX_IN OMX_HANDLETYPE hComp, 514411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 514511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 514611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 514711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 514811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int nPortIndex; 514911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("In for vdpp free_buffer \n"); 515011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 515111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StateIdle && 515211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) 515311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 515411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n"); 515511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 515611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)|| 515711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) 515811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 515911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Buffer while port %lu disabled\n", port); 516011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 516111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause) 516211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 516311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n"); 516411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError, 516511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorPortUnpopulated, 516611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 516711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 516811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 516911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 517011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state != OMX_StateInvalid) 517111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 517211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n"); 517311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError, 517411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorPortUnpopulated, 517511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 517611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 517711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 517811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(port == OMX_CORE_INPUT_PORT_INDEX) 517911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 518011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if arbitrary bytes*/ 518111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!input_use_buffer) 518211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - m_inp_mem_ptr; 518311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 518411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - m_inp_heap_ptr; 518511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 518611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex); 518711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(nPortIndex < drv_ctx.ip_buf.actualcount) 518811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 518911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Clear the bit associated with it. 519011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); 519111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex); 519211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_use_buffer == true) 519311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 519411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 519511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free pmem Buffer index %d",nPortIndex); 519611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_phdr_pmem_ptr) 519711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer(m_phdr_pmem_ptr[nPortIndex]); 519811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 519911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 520011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 520111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer(buffer); 520211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 520311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bPopulated = OMX_FALSE; 520411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Free the Buffer Header*/ 520511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_input_done()) 520611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 520711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" ALL input buffers are freed/released"); 520811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer_header(); 520911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 521011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 521111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 521211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 521311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n"); 521411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 521511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 521611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 521711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING) 521811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_input_done()) 521911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 522011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n"); 522111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING); 522211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable, 522311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_INPUT_PORT_INDEX, 522411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 522511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 522611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 522711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if(port == OMX_CORE_OUTPUT_PORT_INDEX) 522811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 522911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // check if the buffer is valid 523011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - (OMX_BUFFERHEADERTYPE*)m_out_mem_ptr; 523111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(nPortIndex < drv_ctx.op_buf.actualcount) 523211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 523311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex); 523411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Clear the bit associated with it. 523511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_out_bm_count,nPortIndex); 523611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bPopulated = OMX_FALSE; 523711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_output_buffer (buffer); 523811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 523911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_output_done()) 524011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 524111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_output_buffer_header(); 524211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 524311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 524411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 524511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 524611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n"); 524711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 524811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 524911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING) 525011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_output_done()) 525111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 525211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n"); 525311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 525411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n"); 525511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 525611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 525711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_enable_android_native_buffers) 525811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 525911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers"); 526011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 526111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 526211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 526311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 526411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable, 526511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_OUTPUT_PORT_INDEX, 526611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 526711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 526811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 526911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 527011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 527111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 527211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 527311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((eRet == OMX_ErrorNone) && 527411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) 527511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 527611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(release_done()) 527711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 527811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 527911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); 528011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandStateSet, OMX_StateLoaded, 528111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 528211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 528311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 528411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 528511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 528611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 528711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 528811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 528911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 529011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::EmptyThisBuffer 529111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 529211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 529311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel This routine is used to push the video frames to VDPP. 529411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 529511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 529611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 529711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 529811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 529911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything went successful. 530011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 530111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 530211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 530311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 530411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 530511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret1 = OMX_ErrorNone; 530611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount; 530711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 530811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer buffer = %p, buffer->pBuffer = %p, buffer->pPlatformPrivate = %p, buffer->nFilledLen = %lu\n", 530911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // buffer, buffer->pBuffer, buffer->pPlatformPrivate, buffer->nFilledLen); 531011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StateInvalid) 531111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 531211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n"); 531311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 531411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 531511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 531611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL) 531711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 531811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL"); 531911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 532011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 532111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 532211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_inp_bEnabled) 532311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 532411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled."); 532511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 532611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 532711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 532811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) 532911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 533011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %lu", buffer->nInputPortIndex); 533111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 533211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 533311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 533411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_use_buffer == true) 533511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 533611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufferIndex = buffer - m_inp_heap_ptr; 533711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen; 533811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp; 533911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags; 534011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer = &m_inp_mem_ptr[nBufferIndex]; // change heap buffer address to ION buffer address 534111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem %p in Index %d, buffer %p of size %lu", 534211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen); 534311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 534411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else{ 534511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufferIndex = buffer - m_inp_mem_ptr; 534611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 534711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 534811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nBufferIndex > drv_ctx.ip_buf.actualcount ) 534911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 535011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid"); 535111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 535211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 535311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 535411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)", 535511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen); 535611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 535711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel set_frame_rate(buffer->nTimeStamp); 535811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB); 535911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 536111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 536211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 536411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 536511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::empty_this_buffer_proxy 536611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 536811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel This routine is used to push the video decoder output frames to 536911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel the VDPP. 537011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 537111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 537211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 537311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 537411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 537511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything went successful. 537611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 537711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 537811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, 537911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 538011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 538111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int i=0; 538211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned nPortIndex = 0; 538311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 538411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_bufferpayload *temp_buffer; 538511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p1 = 0; 538611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p2 = 0; 538711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 538811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 1\n"); 538911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Should we generate a Aync error event*/ 539011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL || buffer->pInputPortPrivate == NULL) 539111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 539211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid"); 539311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 539411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 539511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 539611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 539711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp::empty_this_buffer_proxy 2 nPortIndex = %d, buffer->nFilledLen = %lu\n", nPortIndex, buffer->nFilledLen); 539811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nPortIndex > drv_ctx.ip_buf.actualcount) 539911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 540011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]", 540111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex); 540211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 540311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 540411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 540511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers++; 540611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 3 pending_input_buffers = %d\n", pending_input_buffers); 540711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* return zero length and not an EOS buffer */ 540811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((buffer->nFilledLen == 0) && 540911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) 541011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 541111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" return zero legth buffer"); 541211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned int)buffer,VDPP_S_SUCCESS, 541311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 541411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 541511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 541611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 541711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // check OMX_BUFFERFLAG_EXTRADATA for interlaced information 541811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // and set it to drv_ctx.interlace if returned interlace mode 541911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // doesn't match drv_ctx.interlace. 542011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 3 buffer->nFlags = 0x%x interlace_user_flag = %d ", buffer->nFlags, interlace_user_flag); 542111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(((buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) != 0) && (false == interlace_user_flag)) 542211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 542311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OTHER_EXTRADATATYPE *pExtra; 542411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_field field = drv_ctx.interlace;// V4L2_FIELD_NONE; 542511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *pTmp = buffer->pBuffer + buffer->nOffset + 3; 542611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 542711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pExtra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U32) pTmp) & ~3); 542811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 3 buffer->nFlags = 0x%x, pExtra->eType = 0x%x\n", buffer->nFlags, pExtra->eType); 542911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // traverset the list of extra data sections 543011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while(OMX_ExtraDataNone != pExtra->eType) 543111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 543211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(OMX_ExtraDataInterlaceFormat == (OMX_QCOM_EXTRADATATYPE)pExtra->eType) 543311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 543411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STREAMINTERLACEFORMAT *interlace_format; 543511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel interlace_format = (OMX_STREAMINTERLACEFORMAT *)pExtra->data; 543611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 543711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (interlace_format->nInterlaceFormats) 543811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 543911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_InterlaceFrameProgressive: 544011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 544111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel field = V4L2_FIELD_NONE; 544211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy V4L2_FIELD_NONE"); 544311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 544411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 544511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_InterlaceInterleaveFrameTopFieldFirst: 544611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 544711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel field = V4L2_FIELD_INTERLACED_TB; 544811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy V4L2_FIELD_INTERLACED_TB"); 544911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 545011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 545111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_InterlaceInterleaveFrameBottomFieldFirst: 545211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 545311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel field = V4L2_FIELD_INTERLACED_BT; 545411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy V4L2_FIELD_INTERLACED_BT"); 545511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 545611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 545711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_InterlaceFrameTopFieldFirst: 545811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 545911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel field = V4L2_FIELD_SEQ_TB; 546011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 546111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 546211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_InterlaceFrameBottomFieldFirst: 546311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 546411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel field = V4L2_FIELD_SEQ_BT; 546511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 546611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 546711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 546811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 546911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 547011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 547111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 547211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pExtra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) pExtra) + pExtra->nSize); 547311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 547411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 547511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.interlace != field) 547611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 547711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.interlace = field; 547811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 547911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // set input port format based on the detected interlace mode 548011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = set_buffer_req(&drv_ctx.ip_buf); 548111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(OMX_ErrorNone != ret) 548211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 548311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid format setting"); 548411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 548511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 548611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 548711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 548811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 548911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 4 \n"); 549011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(input_flush_progress == true) 549111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 549211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Flush in progress return buffer "); 549311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned int)buffer,VDPP_S_SUCCESS, 549411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 549511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 549611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 549711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 549811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp_buffer = (struct vdpp_bufferpayload *)buffer->pInputPortPrivate; 549911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 550011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((temp_buffer - drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) 550111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 550211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 550311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 550411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 550511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW(" ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 550611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*for use_input_heap_buffer memcpy is used*/ 550711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp_buffer->buffer_len = buffer->nFilledLen; 550811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 550911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 551011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_use_buffer) 551111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 551211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 5 \n"); 551311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFilledLen <= temp_buffer->buffer_len) 551411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 551511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp::empty_this_buffer_proxy 5.1 temp_buffer->bufferaddr = %p, m_inp_heap_ptr[%d].pPlatformPrivate = %p, m_inp_heap_ptr[%d].nOffset = %lu\n", 551611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp_buffer->bufferaddr, nPortIndex, m_inp_heap_ptr[nPortIndex].pPlatformPrivate, nPortIndex, m_inp_heap_ptr[nPortIndex].nOffset); 551711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pPlatformPrivate + m_inp_heap_ptr[nPortIndex].nOffset), 551811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // buffer->nFilledLen); 551911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 552011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 552111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 552211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 552311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 552411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 5.2 \n"); 552511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 552611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 552711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef INPUT_BUFFER_LOG 552811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((inputBufferFile >= 0) && (input_buffer_write_counter < 10)) 552911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 553011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int stride = drv_ctx.video_resolution_input.stride; //w 553111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int scanlines = drv_ctx.video_resolution_input.scan_lines; //h 553211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp::empty_buffer_done 2.5 stride = %d, scanlines = %d , frame_height = %d", stride, scanlines, drv_ctx.video_resolution_input.frame_height); 553311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char *temp = (char *)temp_buffer->bufferaddr; 553411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i; 553511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int bytes_written = 0; 553611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.video_resolution_input.frame_height; i++) { 553711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes_written = write(inputBufferFile, temp, drv_ctx.video_resolution_input.frame_width); 553811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp += stride; 553911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 554011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp = (char *)(char *)temp_buffer->bufferaddr + stride * scanlines; 554111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int stride_c = stride; 554211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i = 0; i < drv_ctx.video_resolution_input.frame_height/2; i++) { 554311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes_written += write(inputBufferFile, temp, drv_ctx.video_resolution_input.frame_width); 554411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp += stride_c; 554511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 554611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_buffer_write_counter++; 554711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 554811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 554911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(input_buffer_write_counter >= 10 ) 555011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 555111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(inputBufferFile); 555211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 555311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 555411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 555511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 5.3 \n"); 555611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) 555711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 555811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 5.4 \n"); 555911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 556011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 556111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 556211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 556311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 556411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 556511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 556611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long print_count; 556711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 556811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset( (void *)&buf, 0, sizeof(buf)); 556911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES)); 557011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 557111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) 557211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { buf.flags = V4L2_QCOM_BUF_FLAG_EOS; 557311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("temp_buffer->buffer_len = %d, buffer->nFlags = 0x%lx \n", temp_buffer->buffer_len, buffer->nFlags) ; 557411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" INPUT EOS reached \n") ; 557511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 557611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 557711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 557811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 557911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // The following fills v4l2_buffer structure 558011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = nPortIndex; 558111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 558211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.field = drv_ctx.interlace; 558311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 558411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = drv_ctx.input_num_planes; 558511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 558611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // currently V4L2 driver just passes timestamp to maple FW, and maple FW 558711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // pass the timestamp back to OMX 558811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *(uint64_t *)(&buf.timestamp) = buffer->nTimeStamp; 558911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 559011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].bytesused = drv_ctx.video_resolution_input.frame_width * 559111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.frame_height * 559211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.input_bytesperpixel[0];//buffer->nFilledLen = 0 at this stage 559311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = paddedFrameWidth128(drv_ctx.video_resolution_input.frame_width) * 559411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.frame_height * 559511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.input_bytesperpixel[0]; 559611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = temp_buffer->pmem_fd; 559711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = 0; 559811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(drv_ctx.input_num_planes); 559911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((extra_idx > 0) && (extra_idx < VIDEO_MAX_PLANES)) { 560011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].bytesused = drv_ctx.video_resolution_input.frame_width * 560111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.frame_height * 560211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.input_bytesperpixel[extra_idx]; 560311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = paddedFrameWidth128(drv_ctx.video_resolution_input.frame_width) * 560411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.frame_height * 560511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.input_bytesperpixel[extra_idx]; 560611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 560711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 560811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = temp_buffer->pmem_fd; 560911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = plane[0].reserved[0] + drv_ctx.video_resolution_input.stride * drv_ctx.video_resolution_input.scan_lines; 561011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 561111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx); 561211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 561311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 561411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = plane; 561511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = drv_ctx.input_num_planes; 561611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy: buffer->nFilledLen = %d, plane[0].bytesused = %d plane[0].length = %d,\ 561711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].bytesused = %d, plane[extra_idx].length = %d, plane[extra_idx].data_offset = %d plane[0].data_offset = %d\ 561811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.timestamp.tv_sec = 0x%08x, buf.timestamp.tv_usec = 0x%08x\n", 561911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen, plane[0].bytesused, plane[0].length, plane[extra_idx].bytesused, plane[extra_idx].length, plane[extra_idx].data_offset, plane[0].data_offset, 562011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.timestamp.tv_sec, buf.timestamp.tv_usec); 562111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy: buffer->nTimeStamp = 0x%016llx; buf.timestamp.tv_sec = 0x%08lx, buf.timestamp.tv_usec = 0x%08lx\n", 562211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nTimeStamp, buf.timestamp.tv_sec, buf.timestamp.tv_usec);*/ 562311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 562411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_qbuf_count++; 562511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 562611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef STUB_VPU 562711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 562811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 562911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_vpu_fd, VIDIOC_QBUF, &buf); 563011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(rc) 563111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 563211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver\n"); 563311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 563411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 563511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 563611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 563711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 15 \n"); 563811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 563911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!streaming[OUTPUT_PORT]) 564011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 564111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 564211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret,r; 564311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 16 \n"); 564411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 564511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 564611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret=ioctl(drv_ctx.video_vpu_fd, VIDIOC_STREAMON,&buf_type); 564711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!ret) { 564811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE STREAMON Successful \n"); 564911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[OUTPUT_PORT] = true; 565011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else{ 565111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" \n Failed to call streamon on V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE \n"); 565211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 565311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 565411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 565511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 565611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 565711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef STUB_VPU 565811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.etb_ftb_info.etb_cnt++; 565911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 15 drv_ctx.etb_ftb_info.etb_cnt = %d\n", drv_ctx.etb_ftb_info.etb_cnt); 566011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_index_q_etb.insert_entry(p1,p2,nPortIndex); 566111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //drv_ctx.etb_ftb_info.etb_index = nPortIndex; 566211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.etb_ftb_info.etb_len = buf.length; 566311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&(drv_ctx.async_lock)); 566411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 566511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 566611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 566711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 566811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 566911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 567011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::FillThisBuffer 567111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 567211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 567311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel IL client uses this method to release the frame buffer 567411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel after displaying them. 567511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 567611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 567711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 567811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 567911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 568011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 568111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 568211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 568311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 568411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 568511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 568611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 568711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state == OMX_StateInvalid) 568811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 568911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FTB in Invalid State\n"); 569011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 569111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 569211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 569311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_out_bEnabled) 569411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 569511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled."); 569611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 569711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 569811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 569911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL || 570011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)) 570111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 570211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 570311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 570411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 570511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) 570611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 570711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex); 570811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 570911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 571011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p, buffer->nFilledLen = %lu", buffer, buffer->pBuffer, buffer->nFilledLen); 571111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg); 571211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 571311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 571411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 571511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 571611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 571711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::fill_this_buffer_proxy 571811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 571911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 572011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel IL client uses this method to release the frame buffer 572111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel after displaying them. 572211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 572311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 572411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 572511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 572611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 572711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 572811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 572911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 573011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::fill_this_buffer_proxy( 573111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 573211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd) 573311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 573411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE nRet = OMX_ErrorNone; 573511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *buffer = bufferAdd; 573611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned nPortIndex = 0; 573711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_bufferpayload *ptr_outputbuffer = NULL; 573811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_output_frameinfo *ptr_respbuffer = NULL; 573911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = NULL; 574011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 574111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p1 = 0; 574211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p2 = 0; 574311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 574411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_out_mem_ptr); 574511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 574611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) 574711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 574811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 574911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" FTBProxy: nPortIndex = %d, bufhdr = %p, bufhdr->pBuffer = %p, buffer->nFilledLen = %lu", 575011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex, bufferAdd, bufferAdd->pBuffer, buffer->nFilledLen); 575111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 575211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Return back the output buffer to client*/ 575311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true) 575411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 575511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Output Buffers return flush/disable condition"); 575611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 575711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone (hComp,m_app_data,buffer); 575811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 575911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 576011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers++; 576111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 576211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // set from allocate_output_headers 576311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_respbuffer = (struct vdpp_output_frameinfo*)buffer->pOutputPortPrivate; 576411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ptr_respbuffer) 576511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 576611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptr_outputbuffer = (struct vdpp_bufferpayload*)ptr_respbuffer->client_data; 576711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 576811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 576911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) 577011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 577111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL"); 577211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 577311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone (hComp,m_app_data,buffer); 577411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers--; 577511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 577611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 577711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 577811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 577911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 578011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 578111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 578211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset( (void *)&buf, 0, sizeof(buf)); 578311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES)); 578411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 578511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = nPortIndex; 578611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 578711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 578811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.field = V4L2_FIELD_ANY; 578911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 579011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = drv_ctx.output_num_planes; 579111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].bytesused = drv_ctx.video_resolution_output.frame_width * 579211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_height * 579311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_bytesperpixel[0]; 579411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = paddedFrameWidth128(drv_ctx.video_resolution_output.frame_width) * 579511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_height * 579611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_bytesperpixel[0]; 579711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 579811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 579911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = 0; 580011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(drv_ctx.output_num_planes); 580111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((extra_idx > 0) && (extra_idx < VIDEO_MAX_PLANES)) { 580211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].bytesused = drv_ctx.video_resolution_output.frame_width * 580311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_height * 580411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_bytesperpixel[extra_idx]; 580511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = paddedFrameWidth128(drv_ctx.video_resolution_output.frame_width) * 580611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_height * 580711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_bytesperpixel[extra_idx]; 580811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 580911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = plane[0].reserved[0] + drv_ctx.video_resolution_output.stride * drv_ctx.video_resolution_output.scan_lines;// plane[0].length; 581011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 581111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx); 581211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 581311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 581411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = plane; 581511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // DEBUG_PRINT_LOW("omx_vdpp::fill_this_buffer_proxy: buffer->nFilledLen = %lu, plane[0].bytesused = %d plane[0].length = %d, \ 581611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // plane[extra_idx].bytesused = %d, plane[extra_idx].reserved[0] = 0x%x\n", \ 581711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // buffer->nFilledLen, plane[0].bytesused, plane[0].length, plane[extra_idx].bytesused, plane[extra_idx].reserved[0]); 581811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // 581911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::fill_this_buffer_proxy 2 drv_ctx.ptr_outputbuffer[%d].bufferaddr = %p\n", nPortIndex,drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr); 582011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::fill_this_buffer_proxy 2 drv_ctx.ptr_outputbuffer[%d].offset = %d", nPortIndex,drv_ctx.ptr_outputbuffer[nPortIndex].offset); 582111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 582211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef STUB_VPU 582311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 582411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 582511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_vpu_fd, VIDIOC_QBUF, &buf); 582611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 582711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to qbuf to driver"); 582811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 582911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 583011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 583111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 583211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_qbuf_count++; 583311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::fill_this_buffer_proxy 3\n"); 583411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef STUB_VPU 583511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 583611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.etb_ftb_info.ftb_cnt++; 583711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_index_q_ftb.insert_entry(p1,p2,nPortIndex); 583811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.etb_ftb_info.ftb_len = drv_ctx.op_buf.buffer_size; 583911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post (&(drv_ctx.async_lock)); 584011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp::fill_this_buffer_proxy 4 nPortIndex = %d, drv_ctx.etb_ftb_info.ftb_cnt = %d, drv_ctx.etb_ftb_info.ftb_len = %d\n", 584111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex, drv_ctx.etb_ftb_info.ftb_cnt, drv_ctx.etb_ftb_info.ftb_len); 584211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 584311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 584411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 584511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 584611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 584711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 584811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 584911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 585011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::SetCallbacks 585111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 585211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 585311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Set the callbacks. 585411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 585511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 585611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 585711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 585811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 585911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 586011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 586111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 586211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::set_callbacks(OMX_IN OMX_HANDLETYPE hComp, 586311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_CALLBACKTYPE* callbacks, 586411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData) 586511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 586611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 586711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb = *callbacks; 586811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\ 586911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EventHandler,m_cb.FillBufferDone); 587011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data = appData; 587111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 587211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 587311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 587411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 587511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 587611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::ComponentDeInit 587711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 587811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 587911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Destroys the component and release memory allocated to the heap. 588011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 588111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 588211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 588311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 588411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 588511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 588611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 588711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 588811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::component_deinit(OMX_IN OMX_HANDLETYPE hComp) 588911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 589011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 589111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" omx_vdpp::component_deinit"); 589211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_StateLoaded != m_state) 589311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 589411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\ 589511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state); 589611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Playback Ended - FAILED"); 589711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 589811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 589911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 590011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Playback Ended - PASSED"); 590111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 590211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 590311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if the output buffers have to be cleaned up*/ 590411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_out_mem_ptr) 590511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 590611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Freeing the Output Memory\n"); 590711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) 590811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 590911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_output_buffer (&m_out_mem_ptr[i]); 591011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 591111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 591211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 591311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if the input buffers have to be cleaned up*/ 591411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_inp_mem_ptr || m_inp_heap_ptr) 591511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 591611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Freeing the Input Memory\n"); 591711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) 591811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 591911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr) 592011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer (&m_inp_mem_ptr[i]); 592111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 592211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 592311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer_header(); 592411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_output_buffer_header(); 592511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 592611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Reset counters in mesg queues 592711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.m_size=0; 592811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cmd_q.m_size=0; 592911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.m_size=0; 593011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_index_q_ftb.m_size=0; 593111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_index_q_etb.m_size=0; 593211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.m_read = m_ftb_q.m_write =0; 593311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cmd_q.m_read = m_cmd_q.m_write =0; 593411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.m_read = m_etb_q.m_write =0; 593511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_index_q_ftb.m_read = m_index_q_ftb.m_write =0; 593611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_index_q_etb.m_read = m_index_q_etb.m_write =0; 593711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 593811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug_timestamp) 593911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 594011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_timestamp_list.reset_ts_list(); 594111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 594211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 594311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 594411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Close the driver instance"); 594511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 594611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef INPUT_BUFFER_LOG 594711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (inputBufferFile) 594811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close (inputBufferFile); 594911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 595011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_BUFFER_LOG 595111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (outputBufferFile) 595211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(outputBufferFile); 595311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 595411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG 595511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (outputExtradataFile) 595611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose (outputExtradataFile); 595711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 595811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 595911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" omx_vdpp::component_deinit() complete"); 596011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 596111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 596211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 596311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 596411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::UseEGLImage 596511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 596611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 596711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Use EGL Image method implementation <TBD>. 596811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 596911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 597011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 597111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 597211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 597311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Not Implemented error. 597411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 597511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 597611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp, 597711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 597811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 597911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 598011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN void* eglImage) 598111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 598211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 598311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 598411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 598511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 598611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::ComponentRoleEnum 598711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 598811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 598911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Component Role Enum method implementation. 599011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 599111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 599211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 599311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 599411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 599511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything is successful. 599611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 599711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, 599811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_U8* role, 599911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 index) 600011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 600111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 600211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 600311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // no component role (TODO add it later once component role is determined) 600411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* 600511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!strncmp(drv_ctx.kind, "OMX.qcom.video.vidpp",OMX_MAX_STRINGNAME_SIZE)) 600611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 600711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if((0 == index) && role) 600811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 600911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video.vidpp",OMX_MAX_STRINGNAME_SIZE); 601011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 601111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 601211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 601311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 601411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 601511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 601611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 601711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel*/ 601811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 601911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 602011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 602111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 602211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 602311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 602411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 602511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 602611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::AllocateDone 602711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 602811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 602911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if entire buffer pool is allocated by IL Client or not. 603011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Need this to move to IDLE state. 603111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 603211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 603311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 603411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 603511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 603611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false. 603711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 603811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 603911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::allocate_done(void) 604011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 604111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 604211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet_In = false; 604311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet_Out = false; 604411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 604511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::allocate_done 1\n"); 604611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet_In = allocate_input_done(); 604711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet_Out = allocate_output_done(); 604811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 604911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(bRet_In && bRet_Out) 605011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 605111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 605211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::allocate_done 2\n"); 605311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 605411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::allocate_done 3\n"); 605511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 605611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 605711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 605811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 605911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::AllocateInputDone 606011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 606111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 606211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if I/P buffer pool is allocated by IL Client or not. 606311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 606411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 606511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 606611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 606711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 606811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false. 606911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 607011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 607111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::allocate_input_done(void) 607211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 607311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 607411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i=0; 607511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::allocate_input_done 1\n"); 607611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr == NULL) 607711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 607811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::allocate_input_done 2\n"); 607911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 608011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 608111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_inp_mem_ptr ) 608211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 608311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::allocate_input_done 3\n"); 608411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(;i<drv_ctx.ip_buf.actualcount;i++) 608511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 608611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_ABSENT(&m_inp_bm_count,i)) 608711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 608811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 608911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 609011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 609111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 609211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::allocate_input_done 4 i = %d, drv_ctx.ip_buf.actualcount = %d\n", i, drv_ctx.ip_buf.actualcount); 609311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(i == drv_ctx.ip_buf.actualcount) 609411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 609511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::allocate_input_done 5\n"); 609611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 609711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_HIGH("Allocate done for all i/p buffers"); 609811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 609911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) 610011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 610111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bPopulated = OMX_TRUE; 610211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 610311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 610411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 610511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 610611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 610711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::AllocateOutputDone 610811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 610911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 611011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if entire O/P buffer pool is allocated by IL Client or not. 611111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 611211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 611311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 611411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 611511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 611611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false. 611711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 611811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 611911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::allocate_output_done(void) 612011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 612111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 612211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned j=0; 612311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 612411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr == NULL) 612511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 612611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 612711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 612811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 612911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) 613011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 613111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(;j < drv_ctx.op_buf.actualcount;j++) 613211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 613311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_ABSENT(&m_out_bm_count,j)) 613411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 613511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 613611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 613711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 613811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 613911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 614011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(j == drv_ctx.op_buf.actualcount) 614111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 614211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 614311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Allocate done for all o/p buffers"); 614411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_out_bEnabled) 614511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bPopulated = OMX_TRUE; 614611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 614711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 614811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 614911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 615011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 615111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 615211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 615311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::ReleaseDone 615411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 615511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 615611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if IL client has released all the buffers. 615711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 615811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 615911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 616011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 616111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 616211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 616311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 616411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 616511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::release_done(void) 616611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 616711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 616811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 616911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(release_input_done()) 617011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 617111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(release_output_done()) 617211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 617311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 617411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 617511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 617611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 617711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 617811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 617911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 618011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 618111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 618211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::ReleaseOutputDone 618311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 618411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 618511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if IL client has released all the buffers. 618611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 618711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 618811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 618911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 619011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 619111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 619211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 619311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 619411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::release_output_done(void) 619511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 619611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 619711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i=0,j=0; 619811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 619911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::release_output_done Value of m_out_mem_ptr %p",m_inp_mem_ptr); 620011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_out_mem_ptr) 620111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 620211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(;j < drv_ctx.op_buf.actualcount ; j++) 620311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 620411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(BITMASK_PRESENT(&m_out_bm_count,j)) 620511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 620611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 620711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 620811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 620911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(j == drv_ctx.op_buf.actualcount) 621011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 621111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count = 0; 621211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 621311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 621411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 621511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 621611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 621711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count = 0; 621811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 621911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 622011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 622111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 622211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 622311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION 622411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp::ReleaseInputDone 622511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 622611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 622711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if IL client has released all the buffers. 622811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 622911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 623011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 623111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 623211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 623311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 623411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 623511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel========================================================================== */ 623611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::release_input_done(void) 623711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 623811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 623911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i=0,j=0; 624011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 624111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::release_input_done Value of m_inp_mem_ptr %p",m_inp_mem_ptr); 624211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_inp_mem_ptr) 624311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 624411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(;j<drv_ctx.ip_buf.actualcount;j++) 624511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 624611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if( BITMASK_PRESENT(&m_inp_bm_count,j)) 624711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 624811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 624911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 625011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 625111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(j==drv_ctx.ip_buf.actualcount) 625211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 625311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 625411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 625511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 625611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 625711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 625811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 625911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 626011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 626111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 626211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 626311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::fill_buffer_done(OMX_HANDLETYPE hComp, 626411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE * buffer) 626511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 626611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL; 626711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW(" fill_buffer_done 1 : bufhdr = %p, bufhdr->pBuffer = %p, buffer->nFilledLen = %lu", 626811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // buffer, buffer->pBuffer, buffer->nFilledLen); 626911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 627011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) 627111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 627211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" [FBD] ERROR in ptr(%p)", buffer); 627311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 627411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 627511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (output_flush_progress) 627611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 627711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer); 627811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 627911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nTimeStamp = 0; 628011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 628111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 628211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 628311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 628411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 628511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, buffer->nFilledLen = %lu, buffer->nFlags = 0x%x", 628611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer, buffer->pBuffer, buffer->nFilledLen, buffer->nFlags); 628711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers --; 628811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_dqbuf_count++; 628911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_EOS) 629011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 629111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Output EOS has been reached"); 629211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!output_flush_progress) 629311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event((unsigned)NULL, (unsigned)NULL, 629411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EOS_DONE); 629511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 629611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame) 629711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 629811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame); 629911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 630011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 630111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) 630211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 630311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 630411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL, 630511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)NULL); 630611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 630711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 630811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 630911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 631011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW(" In fill Buffer done call address %p , buffer->nFilledLen = %lu",buffer, buffer->nFilledLen); 631111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_BUFFER_LOG 631211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::fill_buffer_done 1.5, output_buffer_write_counter = %d", output_buffer_write_counter); 631311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(outputBufferFile < 0) 631411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 631511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Failed to create outputBufferFile \n"); 631611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 631711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (outputBufferFile && buffer->nFilledLen && (output_buffer_write_counter <= 10)) 631811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 631911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::fill_buffer_done 2"); 632011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int buf_index = buffer - m_out_mem_ptr; 632111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int stride = drv_ctx.video_resolution_output.stride; //w 632211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int scanlines = drv_ctx.video_resolution_output.scan_lines; //h 632311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr; // mmap ION buffer addr 632411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i; 632511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int bytes_written = 0; 632611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < drv_ctx.video_resolution_output.frame_height; i++) { 632711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes_written = write(outputBufferFile, temp, drv_ctx.video_resolution_output.frame_width); 632811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp += stride; 632911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 633011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines; 633111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int stride_c = stride; 633211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i = 0; i < drv_ctx.video_resolution_output.frame_height/2; i++) { 633311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes_written += write(outputBufferFile, temp, drv_ctx.video_resolution_output.frame_width); 633411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp += stride_c; 633511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 633611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_buffer_write_counter++; 633711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 633811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(output_buffer_write_counter > 10) 633911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 634011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(outputBufferFile); 634111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::fill_buffer_done 2.9 close "); 634211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 634311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 634411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 634511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::fill_buffer_done 3"); 634611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 634711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_cb.FillBufferDone) 634811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 634911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("omx_vdpp::fill_buffer_done 4"); 635011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 635111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_EOS){ 635211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = LLONG_MAX; 635311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = true; 635411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 635511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 635611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp::fill_buffer_done 5 "); 635711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.FillBufferDone (hComp,m_app_data, buffer); 635811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" After Fill Buffer Done callback"); 635911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 636011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 636111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 636211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 636311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 636411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 636511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 636611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 636711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 636811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 636911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::empty_buffer_done(OMX_HANDLETYPE hComp, 637011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* buffer) 637111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 637211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) 637311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 637411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" empty_buffer_done: ERROR bufhdr = %p", buffer); 637511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 637611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 637711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 637811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 637911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer, buffer->pBuffer); 638011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers--; 638111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_dqbuf_count++; 638211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 638311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_cb.EmptyBufferDone) 638411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 638511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen = 0; 638611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_use_buffer == true){ 638711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr]; 638811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 638911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("!!! empty_buffer_done before callback: buffer = %p\n", buffer); 639011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cb.EmptyBufferDone(hComp ,m_app_data, buffer); 639111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 639211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 639311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 639411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 639511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdpp::async_message_process (void *context, void* message) 639611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 639711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_vdpp* omx = NULL; 639811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_msginfo *vdpp_msg = NULL; 639911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* omxhdr = NULL; 640011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer *v4l2_buf_ptr = NULL; 640111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_output_frameinfo *output_respbuf = NULL; 640211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc=1; 640311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("async_message_process 0\n"); 640411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (context == NULL || message == NULL) 640511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 640611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" FATAL ERROR in omx_vdpp::async_message_process NULL Check"); 640711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 640811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 640911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("async_message_process 1\n"); 641011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg = (struct vdpp_msginfo *)message; 641111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 641211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx = reinterpret_cast<omx_vdpp*>(context); 641311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 641411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (vdpp_msg->msgcode) 641511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 641611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 641711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_EVT_HW_ERROR: 641811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 641911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 642011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 642111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 642211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_RESP_START_DONE: 642311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 642411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_START_DONE); 642511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 642611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 642711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_RESP_STOP_DONE: 642811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 642911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_STOP_DONE); 643011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 643111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 643211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_RESP_RESUME_DONE: 643311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 643411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_RESUME_DONE); 643511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 643611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 643711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_RESP_PAUSE_DONE: 643811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 643911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_PAUSE_DONE); 644011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 644111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 644211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_RESP_FLUSH_INPUT_DONE: 644311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 644411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH); 644511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 644611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_RESP_FLUSH_OUTPUT_DONE: 644711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 644811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH); 644911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 645011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_RESP_INPUT_FLUSHED: 645111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_RESP_INPUT_BUFFER_DONE: 645211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW(" VDPP_MSG_RESP_INPUT_BUFFER_DONE 0"); 645311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr = (v4l2_buffer*)vdpp_msg->msgdata.input_frame_clientdata; 645411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Use v4l2_buf_ptr->index returned by VPU V4L2 driver to index into 645511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // m_inp_mem_ptr. v4l2 driver right now returns the same index used in QBUF 645611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // In the future the returned ION handle could be used in empty_buffer_done. 645711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index; 645811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" VDPP_MSG_RESP_INPUT_BUFFER_DONE 1 v4l2_buf_ptr->index = %d", v4l2_buf_ptr->index); 645911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr == NULL || 646011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) 646111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 646211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_ERROR(" VDPP_MSG_RESP_INPUT_BUFFER_DONE 2"); 646311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr = NULL; 646411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg->status_code = VDPP_S_EFATAL; 646511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 646611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW(" VDPP_MSG_RESP_INPUT_BUFFER_DONE 3"); 646711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // No need to update the omxhdr->nFilledLen using the plane[0].len + plane[1].len here. 646811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // based on OMX 3.1.2.9.2, nFilledLen = 0 if input buffer is completely consumed in ebd. 646911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // also refer to ebd code 647011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned int)omxhdr,vdpp_msg->status_code, 647111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 647211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 647311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_RESP_OUTPUT_FLUSHED: 647411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_RESP_OUTPUT_BUFFER_DONE: 647511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 647611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf_ptr = (v4l2_buffer*)vdpp_msg->msgdata.output_frame.client_data; 647711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index; 647811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("VDPP_MSG_RESP_OUTPUT_BUFFER_DONE 1 v4l2_buf_ptr->index = %d\n", v4l2_buf_ptr->index); 647911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 648011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr && omxhdr->pOutputPortPrivate && 648111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) && 648211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((struct vdpp_output_frameinfo *)omxhdr->pOutputPortPrivate 648311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) 648411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 648511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( vdpp_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) 648611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 648711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("VDPP_MSG_RESP_OUTPUT_BUFFER_DONE 2, vdpp_msg->msgdata.output_frame.len = %d, omxhdr->nAllocLen = %ld\n", vdpp_msg->msgdata.output_frame.len, omxhdr->nAllocLen); 648811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFilledLen = vdpp_msg->msgdata.output_frame.len; 648911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nOffset = vdpp_msg->msgdata.output_frame.offset; 649011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nTimeStamp = vdpp_msg->msgdata.output_frame.time_stamp; 649111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags; 649211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 649311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_LOW("VDPP_MSG_RESP_OUTPUT_BUFFER_DONE 2.5 omxhdr->nFilledLen = %ld\n", omxhdr->nFilledLen); 649411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) 649511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 649611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFlags |= OMX_BUFFERFLAG_EOS; 649711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //rc = -1; 649811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 649911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 650011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // use mmaped ION buffer address 650111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg->msgdata.output_frame.bufferaddr = 650211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr; 650311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 650411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf = (struct vdpp_output_frameinfo *)\ 650511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->pOutputPortPrivate; 650611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf->len = vdpp_msg->msgdata.output_frame.len; 650711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_respbuf->offset = vdpp_msg->msgdata.output_frame.offset; 650811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 650911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->output_use_buffer) 651011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy ( omxhdr->pBuffer, (void *) 651111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((unsigned long)vdpp_msg->msgdata.output_frame.bufferaddr + 651211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long)vdpp_msg->msgdata.output_frame.offset), 651311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg->msgdata.output_frame.len); 651411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 651511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 651611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr->nFilledLen = 0; 651711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 651811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //DEBUG_PRINT_HIGH("VDPP_MSG_RESP_OUTPUT_BUFFER_DONE 4 omxhdr->nFilledLen = %ld, OMX_COMPONENT_GENERATE_FBD = %d\n", omxhdr->nFilledLen, OMX_COMPONENT_GENERATE_FBD); 651911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 652011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned int)omxhdr, vdpp_msg->status_code, 652111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_FBD); 652211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 652311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (vdpp_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) 652411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned int)NULL, vdpp_msg->status_code, 652511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EOS_DONE); 652611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 652711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned int)NULL, vdpp_msg->status_code, 652811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 652911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 653011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_EVT_CONFIG_CHANGED: 653111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Port settings changed"); 653211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition, 653311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_PORT_RECONFIG); 653411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 653511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VDPP_MSG_EVT_ACTIVE_REGION_DETECTION_STATUS: 653611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 653711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_rect * p_ar_result = &(vdpp_msg->msgdata.ar_result); 653811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Active Region Detection Status"); 653911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->post_event ((unsigned int)p_ar_result, 654011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vdpp_msg->status_code, 654111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_ACTIVE_REGION_DETECTION_STATUS); 654211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 654311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 654411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 654511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 654611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 654711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 654811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 654911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 655011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 655111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 655211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef USE_ION 655311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdpp::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 655411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 alignment) 655511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 655611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem_allocation allocation; 655711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocation.size = buffer_size; 655811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocation.align = clip2(alignment); 655911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocation.align < 4096) 656011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 656111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocation.align = 4096; 656211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 656311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) 656411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 656511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" Aligment(%u) failed with pmem driver Sz(%lu)", 656611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel allocation.align, allocation.size); 656711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 656811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 656911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 657011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 657111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 657211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 657311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdpp::alloc_map_ion_memory(OMX_U32 buffer_size, 657411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 alignment, struct ion_allocation_data *alloc_data, 657511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_fd_data *fd_data, int flag) 657611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 657711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fd = -EINVAL; 657811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = -EINVAL; 657911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ion_dev_flag; 658011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdpp_ion ion_buf_info; 658111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!alloc_data || buffer_size <= 0 || !fd_data) { 658211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n"); 658311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -EINVAL; 658411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 658511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_dev_flag = (O_RDONLY | O_DSYNC); 658611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = open (MEM_DEVICE, ion_dev_flag); 658711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 658811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd); 658911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return fd; 659011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 659111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 659211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->len = buffer_size; 659311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 659411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // the following settings are from vpu_test.c 659511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->align = 16; 659611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID); 659711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->flags = 0; 659811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 659911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd,ION_IOC_ALLOC,alloc_data); 660011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc || !alloc_data->handle) { 660111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" ION ALLOC memory failed "); 660211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->handle = NULL; 660311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(fd); 660411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = -ENOMEM; 660511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return fd; 660611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 660711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd_data->handle = alloc_data->handle; 660811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd,ION_IOC_MAP,fd_data); 660911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 661011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" ION MAP failed "); 661111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_buf_info.ion_alloc_data = *alloc_data; 661211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_buf_info.ion_device_fd = fd; 661311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_buf_info.fd_ion_data = *fd_data; 661411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&ion_buf_info); 661511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd_data->fd =-1; 661611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(fd); 661711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = -ENOMEM; 661811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 661911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 662011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return fd; 662111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 662211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 662311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdpp::free_ion_memory(struct vdpp_ion *buf_ion_info) { 662411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 662511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!buf_ion_info) { 662611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" ION: free called with invalid fd/allocdata"); 662711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 662811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 662911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE, 663011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &buf_ion_info->ion_alloc_data.handle)) { 663111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR(" ION: free failed" ); 663211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 663311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(buf_ion_info->ion_device_fd); 663411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info->ion_device_fd = -1; 663511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info->ion_alloc_data.handle = NULL; 663611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info->fd_ion_data.fd = -1; 663711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 663811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 663911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdpp::free_output_buffer_header() 664011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 664111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" ALL output buffers are freed/released"); 664211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_use_buffer = false; 664311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ouput_egl_buffers = false; 664411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 664511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) 664611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 664711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_out_mem_ptr); 664811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = NULL; 664911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 665011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 665111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_platform_list) 665211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 665311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_platform_list); 665411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_platform_list = NULL; 665511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 665611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 665711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_respbuffer) 665811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 665911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (drv_ctx.ptr_respbuffer); 666011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = NULL; 666111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 666211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_outputbuffer) 666311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 666411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (drv_ctx.ptr_outputbuffer); 666511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = NULL; 666611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 666711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 666811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.op_buf_ion_info) { 666911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free o/p ion context"); 667011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.op_buf_ion_info); 667111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = NULL; 667211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 667311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 667411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 667511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 667611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdpp::free_input_buffer_header() 667711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 667811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer = false; 667911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 668011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_heap_ptr) 668111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 668211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free input Heap Pointer"); 668311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_inp_heap_ptr); 668411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_heap_ptr = NULL; 668511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 668611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 668711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_phdr_pmem_ptr) 668811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 668911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free input pmem header Pointer"); 669011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_phdr_pmem_ptr); 669111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_phdr_pmem_ptr = NULL; 669211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 669311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 669411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr) 669511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 669611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free input pmem Pointer area"); 669711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_inp_mem_ptr); 669811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr = NULL; 669911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 670011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 670111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ptr_inputbuffer) 670211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 670311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free Driver Context pointer"); 670411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (drv_ctx.ptr_inputbuffer); 670511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_inputbuffer = NULL; 670611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 670711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 670811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.ip_buf_ion_info) { 670911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free ion context"); 671011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ip_buf_ion_info); 671111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ip_buf_ion_info = NULL; 671211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 671311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 671411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 671511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 671611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdpp::stream_off(OMX_U32 port) 671711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 671811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type btype; 671911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 672011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_ports v4l2_port = OUTPUT_PORT; 672111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 672211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_INPUT_PORT_INDEX) { 672311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 672411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_port = OUTPUT_PORT; 672511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 672611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 672711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_port = CAPTURE_PORT; 672811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == OMX_ALL) { 672911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX); 673011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 673111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 673211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!rc_input) 673311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc_input; 673411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 673511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc_output; 673611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 673711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 673811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!streaming[v4l2_port]) { 673911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // already streamed off, warn and move on 674011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port," 674111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " which is already streamed off", v4l2_port); 674211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 674311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 674411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 674511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port); 674611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef STUB_VPU 674711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(drv_ctx.video_vpu_fd, VIDIOC_STREAMOFF, &btype); 674811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 674911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port \n", v4l2_port); 675011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 675111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[v4l2_port] = false; 675211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 675311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 675411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 675511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 675611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 675711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 675811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// return buffer_prop->actualcount and buffer_prop->buffer_size 675911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// based on ip/op format 676011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef STUB_VPU 676111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::get_buffer_req(vdpp_allocatorproperty *buffer_prop) 676211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 676311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 676411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 676511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0; 676611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 676711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 676811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret = 0; 676911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 677011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp::get_buffer_req GetBufReq IN: ActCnt(%d) Size(%d)", 677111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, buffer_prop->buffer_size); 677211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 677311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT){ 677411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 677511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = VP_INPUT_BUFFER_COUNT_INTERLACE; 677611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel }else if (buffer_prop->buffer_type == VDPP_BUFFER_TYPE_OUTPUT){ 677711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 677811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = VP_OUTPUT_BUFFER_COUNT; 677911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel }else 678011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 678111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp:: wrong buffer type"); 678211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 678311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 678411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 678511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount = bufreq.count; 678611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->mincount = bufreq.count; 678711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Count = %d \n ",bufreq.count); 678811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 678911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 679011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)", 679111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, buffer_prop->buffer_size); 679211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 679311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size = drv_ctx.video_resolution_input.frame_height * 679411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paddedFrameWidth128(drv_ctx.video_resolution_input.frame_width) * 679511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3 / 2; // hardcoded size for stub NV12 679611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 679711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = buffer_prop->buffer_size; 679811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 679911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 680011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)", 680111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, buffer_prop->buffer_size, buf_size); 680211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (in_reconfig) // BufReq will be set to driver when port is disabled 680311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size = buf_size; 680411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (buf_size != buffer_prop->buffer_size) 680511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 680611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size = buf_size; 680711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_buffer_req(buffer_prop); 680811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 680911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //} 681011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)", 681111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, buffer_prop->buffer_size); 681211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 681311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 681411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 681511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// set buffer_prop->actualcount through VIDIOC_REQBUFS 681611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::set_buffer_req(vdpp_allocatorproperty *buffer_prop) 681711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 681811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 681911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned buf_size = 0; 682011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 682111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 682211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret; 682311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp::set_buffer_req SetBufReq IN: ActCnt(%d) Size(%d)", 682411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, buffer_prop->buffer_size); 682511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 682611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_size != buffer_prop->buffer_size) 682711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 682811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)", 682911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size, buf_size); 683011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 683111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 683211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 683311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 683411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 683511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 683611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// call VIDIOC_REQBUFS to set the initial number of buffers that app wants to 683711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// use in streaming 683811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// return buffer_prop->buffer_size and ip/op resolution based on ip/op format 683911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::get_buffer_req(vdpp_allocatorproperty *buffer_prop) 684011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 684111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 684211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 684311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0; 684411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 684511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret = 0; 684611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 684711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&fmt, 0, sizeof(v4l2_format)); 684811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&bufreq, 0, sizeof(v4l2_requestbuffers)); 684911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("GetBufReq IN: ActCnt(%d) Size(%d) buffer_prop->buffer_type (%d), streaming[OUTPUT_PORT] (%d), streaming[CAPTURE_PORT] (%d)", 685011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type, streaming[OUTPUT_PORT], streaming[CAPTURE_PORT]); 685111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 685211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT){ 685311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 685411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 685511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 685611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = VP_INPUT_BUFFER_COUNT_INTERLACE; 685711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel }else if (buffer_prop->buffer_type == VDPP_BUFFER_TYPE_OUTPUT){ 685811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 685911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 686011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 686111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = VP_OUTPUT_BUFFER_COUNT; 686211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel }else {eRet = OMX_ErrorBadParameter;} 686311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eRet==OMX_ErrorNone){ 686411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd,VIDIOC_REQBUFS, &bufreq); 686511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 686611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ret) 686711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 686811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("GetBufReq Requesting buffer requirements failed 1"); 686911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 687011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 687111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 687211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 687311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 687411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount = bufreq.count; 687511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->mincount = bufreq.count; 687611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Count = %d \n ",bufreq.count); 687711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 687811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d), buffer_prop->buffer_type(%d) fmt.fmt.pix_mp.pixelformat (0x%08x)", 687911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type, fmt.fmt.pix_mp.pixelformat); 688011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 688111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT) 688211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 688311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution_input.frame_height; 688411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution_input.frame_width; 688511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (V4L2_FIELD_NONE == drv_ctx.interlace) 688611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 688711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 688811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 688911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 689011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 689111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_INTERLACED; 689211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 689311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 689411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 689511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 689611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 689711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution_output.frame_height; 689811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution_output.frame_width; 689911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 690011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 690111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 690211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_G_FMT, &fmt); 690311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // S_FMT is always called before get_buffer_req 690411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // we should be able to use G_FMT to get fmt info. 690511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_TRY_FMT, &fmt); 690611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_G_FMT, &fmt); 690711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 690811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT) 690911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 691011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.input_num_planes = fmt.fmt.pix_mp.num_planes; 691111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.frame_height = fmt.fmt.pix_mp.height; 691211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.frame_width = fmt.fmt.pix_mp.width; 691311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("GetBufReq drv_ctx.video_resolution_input.frame_height = %d, drv_ctx.video_resolution_input.frame_width = %d ", 691411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_input.frame_height, drv_ctx.video_resolution_input.frame_width); 691511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 691611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 691711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 691811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_num_planes = fmt.fmt.pix_mp.num_planes; 691911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_height = fmt.fmt.pix_mp.height; 692011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_width = fmt.fmt.pix_mp.width; 692111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("GetBufReq drv_ctx.video_resolution_output.frame_height = %d, drv_ctx.video_resolution_output.frame_width = %d ", 692211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.video_resolution_output.frame_height, drv_ctx.video_resolution_output.frame_width); 692311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 692411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 692511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->frame_size = paddedFrameWidth32(fmt.fmt.pix_mp.height) * 692611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paddedFrameWidth128(fmt.fmt.pix_mp.width) * 692711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3 / 2; 692811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("GetBufReq fmt.fmt.pix_mp.num_planes = %d, fmt.fmt.pix_mp.height = %d, fmt.fmt.pix_mp.width = %d, buffer_prop->frame_size = %d \n", 692911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.num_planes, fmt.fmt.pix_mp.height, fmt.fmt.pix_mp.width, buffer_prop->frame_size); 693011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 693111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 693211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ret) 693311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 693411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("GetBufReq Requesting buffer requirements failed 2"); 693511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 693611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 693711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 693811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 693911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 694011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 694111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = buffer_prop->buffer_size; 694211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT) 694311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 694411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(drv_ctx.input_num_planes); 694511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 694611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 694711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 694811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(drv_ctx.output_num_planes); 694911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 695011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 695111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((extra_idx > 0) && (extra_idx < VIDEO_MAX_PLANES)) { 695211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage; 695311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_vdpp::get_buffer_req extra_data_size: %d\n", extra_data_size); 695411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 695511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx); 695611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 695711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 695811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 695911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 696011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Frame info extra data enabled!"); 696111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE; 696211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 696311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_INTERLACE_EXTRADATA) 696411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 696511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Interlace extra data enabled!"); 696611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE; 696711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 696811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extradata & OMX_PORTDEF_EXTRADATA) 696911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 697011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE; 697111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n", 697211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extra_data_size); 697311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 697411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (client_extra_data_size) 697511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 697611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator 697711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit 697811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 697911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // update buffer_prop->buffer_size to include plane 1 buffer size 698011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // so only 1 ION buffer will be allocated for each input/output buffer 698111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_data_size > 0) 698211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 698311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size += extra_data_size; 698411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 698511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 698611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size; 698711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.count = buffer_prop->actualcount; 698811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.extradata_info.buffer_size = extra_data_size; 698911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size += client_extra_data_size; // client_extra_data_size defaults to 0 699011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 699111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)", 699211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, buffer_prop->buffer_size, buf_size); 699311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (in_reconfig) // BufReq will be set to driver when port is disabled 699411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size = buf_size; 699511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (buf_size != buffer_prop->buffer_size) 699611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 699711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size = buf_size; 699811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = set_buffer_req(buffer_prop); 699911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 700011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 700111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d) buffer_prop->buffer_type(%d)", 700211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type); 700311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 700411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 700511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 700611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// set buffer_prop->actualcount through VIDIOC_REQBUFS 700711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::set_buffer_req(vdpp_allocatorproperty *buffer_prop) 700811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 700911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 701011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned buf_size = 0; 701111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 701211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 701311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 701411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret; 701511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)", 701611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, buffer_prop->buffer_size); 701711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&fmt, 0, sizeof(v4l2_format)); 701811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&bufreq, 0, sizeof(v4l2_requestbuffers)); 701911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 702011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buf_size != buffer_prop->buffer_size) 702111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 702211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)", 702311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->buffer_size, buf_size); 702411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 702511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 702611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 702711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 702811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 702911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT){ 703011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 703111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = output_capability; 703211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 703311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (V4L2_FIELD_NONE == drv_ctx.interlace) 703411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 703511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 703611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 703711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 703811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 703911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_INTERLACED; 704011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 704111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution_input.frame_height; 704211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution_input.frame_width; 704311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 704411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setFormatParams(output_capability, drv_ctx.input_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 704511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 704611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 704711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * 704811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.input_bytesperpixel[i] * 704911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height); 705011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].bytesperline = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.input_bytesperpixel[0]); // both plane have the same plane stride 705111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 705211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (buffer_prop->buffer_type == VDPP_BUFFER_TYPE_OUTPUT) { 705311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 705411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = capture_capability; 705511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 705611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = drv_ctx.video_resolution_output.frame_height; 705711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = drv_ctx.video_resolution_output.frame_width; 705811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 705911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel setFormatParams(capture_capability, drv_ctx.output_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 706011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 706111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 706211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * 706311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.output_bytesperpixel[i] * 706411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height); 706511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.plane_fmt[i].bytesperline = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.output_bytesperpixel[0]); 706611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_buffer_req fmt.fmt.pix_mp.plane_fmt[%d].sizeimage = %d \n ", i, fmt.fmt.pix_mp.plane_fmt[i].sizeimage); 706711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 706811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else {eRet = OMX_ErrorBadParameter;} 706911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 707011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 707111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) 707211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 707311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret); 707411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 707511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 707611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 707711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 707811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("set_buffer_req drv_ctx.interlace = %d", drv_ctx.interlace); 707911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 708011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 708111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 708211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = buffer_prop->actualcount; 708311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT) { 708411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 708511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (buffer_prop->buffer_type == VDPP_BUFFER_TYPE_OUTPUT) { 708611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 708711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else {eRet = OMX_ErrorBadParameter;} 708811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 708911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet==OMX_ErrorNone) { 709011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(drv_ctx.video_vpu_fd,VIDIOC_REQBUFS, &bufreq); 709111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 709211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 709311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) 709411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 709511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret); 709611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 709711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (bufreq.count < buffer_prop->actualcount) { 709811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Driver refused to change the number of buffers" 709911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " on v4l2 port %d to %d (prefers %d)", bufreq.type, 710011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_prop->actualcount, bufreq.count); 710111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 710211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 710311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 710411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 710511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 710611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 710711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 710811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 710911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn) 711011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 711111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 711211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!portDefn) 711311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 711411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 711511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 711611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_vdpp::update_portdef\n"); 711711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nVersion.nVersion = OMX_SPEC_VERSION; 711811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nSize = sizeof(portDefn); 711911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->eDomain = OMX_PortDomainVideo; 712011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.frame_rate.fps_denominator > 0) 712111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator / 712211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator; 712311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 712411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Divide by zero \n"); 712511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 712611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 712711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (OMX_CORE_INPUT_PORT_INDEX == portDefn->nPortIndex) 712811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 712911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->eDir = OMX_DirInput; 713011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount; 713111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount; 713211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size; 713311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;//OMX_COLOR_FormatYUV420Planar;//OMX_COLOR_FormatUnused; 713411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 713511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->bEnabled = m_inp_bEnabled; 713611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->bPopulated = m_inp_bPopulated; 713711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameHeight = drv_ctx.video_resolution_input.frame_height; 713811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth = drv_ctx.video_resolution_input.frame_width; 713911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nStride = drv_ctx.video_resolution_input.stride; 714011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nSliceHeight = drv_ctx.video_resolution_input.scan_lines; 714111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 714211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (OMX_CORE_OUTPUT_PORT_INDEX == portDefn->nPortIndex) 714311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 714411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->eDir = OMX_DirOutput; 714511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount; 714611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferCountMin = drv_ctx.op_buf.mincount; 714711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferSize = drv_ctx.op_buf.buffer_size; 714811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 714911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->bEnabled = m_out_bEnabled; 715011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->bPopulated = m_out_bPopulated; 715111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.eColorFormat = (OMX_COLOR_FORMATTYPE) QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 715211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 715311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // video_resolution_output.frame_height is retrieved from get_bufreq 715411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameHeight = drv_ctx.video_resolution_output.frame_height; 715511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth = drv_ctx.video_resolution_output.frame_width; 715611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nStride = drv_ctx.video_resolution_output.stride; 715711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nSliceHeight = drv_ctx.video_resolution_output.scan_lines; 715811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 715911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 716011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 716111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->eDir = OMX_DirMax; 716211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d", 716311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)portDefn->nPortIndex); 716411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 716511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 716611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 716711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("update_portdef for %lu Width = %lu Height = %lu Stride = %ld SliceHeight = %lu portDefn->format.video.eColorFormat = %d \n", portDefn->nPortIndex, 716811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameWidth, 716911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nFrameHeight, 717011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nStride, 717111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.nSliceHeight, 717211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.eColorFormat); 717311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 717411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 717511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 717611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 717711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::allocate_output_headers() 717811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 717911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 718011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufHdr = NULL; 718111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i= 0; 718211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 718311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!m_out_mem_ptr) { 718411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH(" Use o/p buffer case - Header List allocation"); 718511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nBufHdrSize = 0; 718611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPlatformEntrySize = 0; 718711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPlatformListSize = 0; 718811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nPMEMInfoSize = 0; 718911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 719011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 719111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 719211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 719311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n", 719411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 719511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufHdrSize = drv_ctx.op_buf.actualcount * 719611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_BUFFERHEADERTYPE); 719711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 719811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d \n",nBufHdrSize, 719911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_BUFFERHEADERTYPE)); 720011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 720111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 720211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 720311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = (struct vdpp_bufferpayload *) \ 720411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct vdpp_bufferpayload), 720511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 720611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = (struct vdpp_output_frameinfo *)\ 720711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof (struct vdpp_output_frameinfo), 720811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf.actualcount); 720911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 721011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = (struct vdpp_ion * ) \ 721111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc (sizeof(struct vdpp_ion),drv_ctx.op_buf.actualcount); 721211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 721311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!drv_ctx.op_buf_ion_info) { 721411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info"); 721511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 721611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 721711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 721811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 721911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_out_mem_ptr && drv_ctx.ptr_outputbuffer 722011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && drv_ctx.ptr_respbuffer) 722111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 722211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr = m_out_mem_ptr; 722311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr); 722411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 722511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(i=0; i < drv_ctx.op_buf.actualcount ; i++) 722611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 722711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 722811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 722911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Set the values when we determine the right HxW param 723011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nAllocLen = 0; 723111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nFilledLen = 0; 723211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pAppPrivate = NULL; 723311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 723411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pBuffer = NULL; // since no buffer is allocated 723511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 723611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer[i].pmem_fd = -1; 723711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 723811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info[i].ion_device_fd =-1; 723911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 724011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Create a mapping between buffers*/ 724111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 724211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer[i].client_data = (void *) \ 724311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &drv_ctx.ptr_outputbuffer[i]; 724411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Move the buffer and buffer header pointers 724511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr++; 724611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 724711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 724811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 724911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 725011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p]\n",\ 725111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr); 725211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_out_mem_ptr) 725311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 725411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_out_mem_ptr); 725511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = NULL; 725611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 725711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 725811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.ptr_outputbuffer) 725911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 726011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ptr_outputbuffer); 726111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_outputbuffer = NULL; 726211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 726311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(drv_ctx.ptr_respbuffer) 726411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 726511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.ptr_respbuffer); 726611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.ptr_respbuffer = NULL; 726711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 726811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 726911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (drv_ctx.op_buf_ion_info) { 727011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Free o/p ion context"); 727111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(drv_ctx.op_buf_ion_info); 727211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.op_buf_ion_info = NULL; 727311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 727411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 727511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 727611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 727711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 727811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 727911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 728011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 728111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 728211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 728311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdpp::complete_pending_buffer_done_cbs() 728411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 728511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p1; 728611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned p2; 728711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned ident; 728811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_cmd_queue tmp_q, pending_bd_q; 728911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 729011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // pop all pending GENERATE FDB from ftb queue 729111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_ftb_q.m_size) 729211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 729311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.pop_entry(&p1,&p2,&ident); 729411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ident == OMX_COMPONENT_GENERATE_FBD) 729511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 729611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_bd_q.insert_entry(p1,p2,ident); 729711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 729811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 729911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 730011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.insert_entry(p1,p2,ident); 730111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 730211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 730311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //return all non GENERATE FDB to ftb queue 730411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while(tmp_q.m_size) 730511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 730611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.pop_entry(&p1,&p2,&ident); 730711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.insert_entry(p1,p2,ident); 730811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 730911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // pop all pending GENERATE EDB from etb queue 731011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_etb_q.m_size) 731111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 731211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.pop_entry(&p1,&p2,&ident); 731311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ident == OMX_COMPONENT_GENERATE_EBD) 731411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 731511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_bd_q.insert_entry(p1,p2,ident); 731611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 731711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 731811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 731911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.insert_entry(p1,p2,ident); 732011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 732111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 732211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //return all non GENERATE FDB to etb queue 732311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while(tmp_q.m_size) 732411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 732511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.pop_entry(&p1,&p2,&ident); 732611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.insert_entry(p1,p2,ident); 732711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 732811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 732911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // process all pending buffer dones 733011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while(pending_bd_q.m_size) 733111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 733211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_bd_q.pop_entry(&p1,&p2,&ident); 733311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch(ident) 733411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 733511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EBD: 733611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) 733711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 733811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!\n"); 733911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 734011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 734111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 734211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 734311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_FBD: 734411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) 734511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 734611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!\n"); 734711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 734811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 734911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 735011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 735111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 735211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 735311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 735411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdpp::set_frame_rate(OMX_S64 act_timestamp) 735511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 735611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// No framerate control on 8084 VPU. This API is for 8092. 735711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FRC_ENABLE 735811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 new_frame_interval = 0; 735911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts 736011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) 736111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 736211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_frame_interval = (act_timestamp > prev_ts)? 736311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel act_timestamp - prev_ts : 736411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts - act_timestamp; 736511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (new_frame_interval < frm_int || frm_int == 0) 736611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 736711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int = new_frame_interval; 736811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(frm_int) 736911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 737011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_numerator = 1e6; 737111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel drv_ctx.frame_rate.fps_denominator = frm_int; 737211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set_frame_rate: frm_int(%lu) fps(%f)", 737311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frm_int, drv_ctx.frame_rate.fps_numerator / 737411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (float)drv_ctx.frame_rate.fps_denominator); 737511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 737611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* We need to report the difference between this FBD and the previous FBD 737711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * back to the driver for clock scaling purposes. */ 737811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_outputparm oparm; 737911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*XXX: we're providing timing info as seconds per frame rather than frames 738011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * per second.*/ 738111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 738211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 738311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 738411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_streamparm sparm; 738511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 738611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sparm.parm.output = oparm; 738711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_PARM, &sparm)) 738811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 738911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \ 739011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel performance might be affected"); 739111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 739211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 739311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 739411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 739511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 739611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = act_timestamp; 739711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 739811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 739911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 740011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdpp::adjust_timestamp(OMX_S64 &act_timestamp) 740111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 740211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rst_prev_ts && VALID_TS(act_timestamp)) 740311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 740411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = act_timestamp; 740511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = false; 740611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 740711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (VALID_TS(prev_ts)) 740811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 740911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool codec_cond = (drv_ctx.timestamp_adjust)? 741011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)? 741111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)): 741211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (!VALID_TS(act_timestamp) || act_timestamp == prev_ts); 741311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(frm_int > 0 && codec_cond) 741411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 741511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp); 741611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel act_timestamp = prev_ts + frm_int; 741711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp); 741811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prev_ts = act_timestamp; 741911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 742011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 742111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel set_frame_rate(act_timestamp); 742211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 742311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (frm_int > 0) // In this case the frame rate was set along 742411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { // with the port definition, start ts with 0 742511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel act_timestamp = prev_ts = 0; // and correct if a valid ts is received. 742611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rst_prev_ts = true; 742711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 742811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 742911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 743011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdpp::enable_extradata(OMX_U32 requested_extradata, bool enable) 743111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 743211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 743311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_state != OMX_StateLoaded) 743411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 743511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only"); 743611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 743711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 743811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("enable_extradata: actual[%lx] requested[%lx] enable[%d]", 743911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata, requested_extradata, enable); 744011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 744111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable) 744211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata |= requested_extradata; 744311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 744411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel client_extradata = client_extradata & ~requested_extradata; 744511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 744611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 744711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 744811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 744911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdpp::setFormatParams(int pixelFormat, double bytesperpixel[], unsigned char *planesCount) 745011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 745111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*24 RGB-8-8-8 */ 745211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (pixelFormat) 745311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 745411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_RGB24: 745511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *planesCount = 0; 745611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[0] = 3; 745711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 745811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 745911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*32 ARGB-8-8-8-8 */ 746011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_RGB32: 746111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *planesCount = 0; 746211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[0] = 4; 746311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 746411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 746511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*32 ARGB-2-10-10-10*/ 746611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_XRGB2: 746711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *planesCount = 0; 746811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[0] = 4; 746911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 747011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 747111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*24 BGR-8-8-8 */ 747211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_BGR24: 747311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *planesCount = 0; 747411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[0] = 3; 747511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 747611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 747711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*32 BGRX-8-8-8-8 */ 747811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_BGR32: 747911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *planesCount = 0; 748011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[0] = 4; 748111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 748211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 748311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*32 XBGR-2-10-10-10*/ 748411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_XBGR2: 748511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *planesCount = 0; 748611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[0] = 4; 748711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 748811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 748911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*12 YUV 4:2:0 semi-planar*/ 749011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_NV12: 749111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *planesCount = 2; 749211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[0] = 1; 749311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[1] = 0.5; 749411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 749511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 749611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*12 YVU 4:2:0 semi-planar*/ 749711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_NV21: 749811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *planesCount = 2; 749911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[0] = 1; 750011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[1] = 0.5; 750111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 750211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 750311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 16 YUYV 4:2:2 interleaved*/ 750411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_YUYV: 750511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *planesCount = 2; 750611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[0] = 2; 750711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[1] = 0.5; 750811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 750911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 751011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 16 YVYU 4:2:2 interleaved*/ 751111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_YVYU: 751211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *planesCount = 1; 751311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[0] = 2; 751411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 751511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 751611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 16 VYUY 4:2:2 interleaved*/ 751711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_VYUY: 751811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *planesCount = 1; 751911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[0] = 2; 752011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 752111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 752211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 16 UYVY 4:2:2 interleaved*/ 752311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_UYVY: 752411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *planesCount = 1; 752511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytesperpixel[0] = 2; 752611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 752711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 752811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 752911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: ERROR: pixel format %d is not supported!\n", 753011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel __func__, pixelFormat); 753111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 753211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 753311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 753411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 753511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdpp::openInput(const char* inputName) 753611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 753711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fd = -1; 753811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel const char *dirname = "/sys/class/video4linux"; 753911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char devname[PATH_MAX]; 754011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char dev[PATH_MAX]; 754111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char *filename; 754211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DIR *dir; 754311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct dirent *de; 754411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dir = opendir(dirname); 754511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(dir == NULL) 754611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 754711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(dev, dirname, sizeof(dev)); 754811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel filename = dev + strlen(dev); 754911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *filename++ = '/'; 755011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while((de = readdir(dir))) 755111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 755211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(de->d_name[0] == '.' && 755311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (de->d_name[1] == '\0' || 755411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (de->d_name[1] == '.' && de->d_name[2] == '\0'))) 755511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 755611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(filename, de->d_name, PATH_MAX - sizeof(dev) - 1); 755711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*DEBUG_PRINT_LOW("Filename found: %s\n", filename);*/ 755811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char name[80]; 755911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fd_devname; 756011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int result; 756111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(devname, dev, sizeof(devname)); 756211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcat(devname, "/name", sizeof(devname)); 756311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*DEBUG_PRINT_LOW("opening name file: %s\n", devname);*/ 756411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* find and read device node names from sys/conf/video4linux dir*/ 756511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd_devname = open(devname,O_RDONLY); 756611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(fd_devname < 0) 756711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("openInput: could not find device name.\n"); 756811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel result = read(fd_devname, name, strlen(inputName)); 756911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(result < 0) 757011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 757111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("openInput: could not read device name.\n"); 757211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 757311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 757411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 757511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!strcmp(name, inputName)) 757611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 757711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(fd_devname); 757811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* open the vpu driver node found from /dev dir */ 757911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char temp[80]; 758011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(temp, "/dev/", sizeof(temp)); 758111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcat(temp, filename, sizeof(temp)); 758211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("openInput: opening device: %s\n", temp); 758311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = open(temp, O_RDWR | O_NONBLOCK); 758411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(fd < 0) 758511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("openInput: Error opening device %s\n", temp); 758611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 758711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 758811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 758911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 759011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(fd_devname); 759111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 759211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel closedir(dir); 759311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ALOGE_IF(fd<0, "couldn't find '%s' input device", inputName); 759411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return fd; 759511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 7596