1e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/*--------------------------------------------------------------------------------------- 2e4010605f233a213cf0d972397bb33c34c364227Patrick TjinCopyright (c) 2013-2015, The Linux Foundation. All rights reserved. 3e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRedistribution and use in source and binary forms, with or without 5e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinmodification, are permitted provided that the following conditions are met: 6e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * Redistributions of source code must retain the above copyright 7e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin notice, this list of conditions and the following disclaimer. 8e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * Redistributions in binary form must reproduce the above copyright 9e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin notice, this list of conditions and the following disclaimer in the 10e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin documentation and/or other materials provided with the distribution. 11e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * Neither the name of The Linux Foundation nor 12e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin the names of its contributors may be used to endorse or promote 13e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin products derived from this software without specific prior written 14e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin permission. 15e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 16e4010605f233a213cf0d972397bb33c34c364227Patrick TjinTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17e4010605f233a213cf0d972397bb33c34c364227Patrick TjinAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18e4010605f233a213cf0d972397bb33c34c364227Patrick TjinIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19e4010605f233a213cf0d972397bb33c34c364227Patrick TjinNON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 20e4010605f233a213cf0d972397bb33c34c364227Patrick TjinCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21e4010605f233a213cf0d972397bb33c34c364227Patrick TjinEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24e4010605f233a213cf0d972397bb33c34c364227Patrick TjinWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26e4010605f233a213cf0d972397bb33c34c364227Patrick TjinADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin--------------------------------------------------------------------------*/ 28e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 29e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/*============================================================================ 30e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin O p e n M A X w r a p p e r s 31e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin O p e n M A X C o r e 32e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 33e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin*//** @file omx_vdpp.cpp 34e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin This module contains the implementation of the OpenMAX video post-processing component. 35e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 36e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin*//*========================================================================*/ 37e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 38e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin////////////////////////////////////////////////////////////////////////////// 39e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// Include Files 40e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin////////////////////////////////////////////////////////////////////////////// 41e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define LOG_NDEBUG 0 42e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <string.h> 43e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <pthread.h> 44e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <sys/prctl.h> 45e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <stdlib.h> 46e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <unistd.h> 47e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <errno.h> 48e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include "omx_vdpp.h" 49e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <fcntl.h> 50e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <limits.h> 51e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <media/msm_media_info.h> 52e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 53e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef _ANDROID_ 54e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <sys/ioctl.h> 55e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <sys/mman.h> 56e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif //_ANDROID_ 57e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 58e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _ANDROID_ 59e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <cutils/properties.h> 60e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#undef USE_EGL_IMAGE_GPU 61e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 62e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 63e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 64e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <gralloc_priv.h> 65e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 66e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 67e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef INPUT_BUFFER_LOG 68e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint inputBufferFile; 69e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinchar inputfilename[] = "/sdcard/input-bitstream"; 70e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 71e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef OUTPUT_BUFFER_LOG 72e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint outputBufferFile; 73e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinchar outputfilename[] = "/sdcard/output.yuv"; 74e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 75e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef OUTPUT_EXTRADATA_LOG 76e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFILE *outputExtradataFile; 77e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinchar ouputextradatafilename[] = "/data/extradata"; 78e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 79e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 80e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <stdarg.h> 81e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <sys/stat.h> 82e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <dirent.h> 83e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 84e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _ANDROID_ 85e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extern "C"{ 86e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin #include<utils/Log.h> 87e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 88e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif//_ANDROID_ 89e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 90e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define POLL_TIMEOUT 0x7fffffff //10000// 91e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define MEM_DEVICE "/dev/ion" 92e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define MEM_HEAP_ID ION_CP_MM_HEAP_ID 93e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 94e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define DEFAULT_FPS 30 95e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define MAX_INPUT_ERROR DEFAULT_FPS 96e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define MAX_SUPPORTED_FPS 120 97e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 98e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SZ_4K 0x1000 99e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } } 101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); } 102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define EXTRADATA_IDX(__num_planes) (__num_planes - 1) 103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA) 105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid* async_message_thread (void *input) 108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int extra_idx = 0; 110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc = 0; 111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *buffer; 112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_plane plane[VIDEO_MAX_PLANES]; 113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct pollfd pfd[2]; 114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_buffer v4l2_buf; 115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_event dqevent; 116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp *omx = reinterpret_cast<omx_vdpp*>(input); 117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pfd[0].events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pfd[0].fd = omx->drv_ctx.video_vpu_fd; 119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pfd[1].events = POLLIN | POLLPRI | POLLERR; 120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pfd[1].fd = omx->m_ctrl_in; 121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp: Async thread start\n"); 124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prctl(PR_SET_NAME, (unsigned long)"VdppCallBackThread", 0, 0, 0); 125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (1) 126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = poll(pfd, 2, POLL_TIMEOUT); 128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!rc) { 130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Poll timedout\n"); 131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; // no input buffers EOS reached 132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (rc < 0) { 133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Error while polling: %d\n", rc); 134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("async_message_thread 1 POLL_TIMEOUT = 0x%x", POLL_TIMEOUT); 137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pfd[1].revents & (POLLIN | POLLPRI | POLLERR)) 139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("pipe event, exit async thread"); 141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // output buffer ready for fbd 145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((pfd[0].revents & POLLIN) || (pfd[0].revents & POLLRDNORM)) { 146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("async_message_thread 1\n"); 147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_msginfo vdpp_msg; 148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.memory = V4L2_MEMORY_USERPTR; 150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.length = omx->drv_ctx.output_num_planes; 151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.m.planes = plane; 152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while(!ioctl(pfd[0].fd, VIDIOC_DQBUF, &v4l2_buf)) { 153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("async_message_thread 2\n"); 154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgcode=VDPP_MSG_RESP_OUTPUT_BUFFER_DONE; 155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.status_code=VDPP_S_SUCCESS; 156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf; 157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // driver returns ION buffer address, but case VDPP_MSG_RESP_OUTPUT_BUFFER_DONE 159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // will pass mmaped address to upper layer, and then driver sets it when returnning 160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // DQBUF for output buffers. 161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extra_idx = EXTRADATA_IDX(omx->drv_ctx.output_num_planes); 162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // this len is used in fill_buffer_done buffer->nFilledLen 164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // is different from FTBProxy plane[0].length 165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgdata.output_frame.len= v4l2_buf.m.planes[0].bytesused + v4l2_buf.m.planes[extra_idx].bytesused; 166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //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); 167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else { 169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgdata.output_frame.len=v4l2_buf.m.planes[0].bytesused; 170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_HIGH("async_message_thread 2.5 - 2 plane[0].bytesused = %d\n", v4l2_buf.m.planes[0].bytesused); 171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgdata.output_frame.bufferaddr=(void*)v4l2_buf.m.planes[0].m.userptr; 173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // currently V4L2 driver just passes timestamp to maple FW, and maple FW 175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // pass the timestamp back to OMX 176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgdata.output_frame.time_stamp = *(uint64_t *)(&v4l2_buf.timestamp); 177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //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); 179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omx->async_message_process(input,&vdpp_msg) < 0) { 180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" async_message_thread Exited \n"); 181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // input buffer ready for empty buffer done (ebd) 186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if((pfd[0].revents & POLLOUT) || (pfd[0].revents & POLLWRNORM)) { 187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_msginfo vdpp_msg; 188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.memory = V4L2_MEMORY_USERPTR; 190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.length = omx->drv_ctx.input_num_planes; 191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.m.planes = plane; 192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("async_message_thread 3\n"); 193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while(!ioctl(pfd[0].fd, VIDIOC_DQBUF, &v4l2_buf)) { 194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgcode=VDPP_MSG_RESP_INPUT_BUFFER_DONE; 195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.status_code=VDPP_S_SUCCESS; 196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf; 197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extra_idx = EXTRADATA_IDX(omx->drv_ctx.input_num_planes); 199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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 201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //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); 202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else { 204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgdata.output_frame.len=v4l2_buf.m.planes[0].bytesused; 205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_HIGH("async_message_thread 3.5 - 2 plane[0].bytesused = %d\n", v4l2_buf.m.planes[0].bytesused); 206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omx->async_message_process(input,&vdpp_msg) < 0) { 208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" async_message_thread Exited \n"); 209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pfd[0].revents & POLLPRI){ 214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("async_message_thread 4\n"); 215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&dqevent, 0, sizeof(struct v4l2_event)); 216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(pfd[0].fd, VIDIOC_DQEVENT, &dqevent); 217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(dqevent.type == VPU_EVENT_HW_ERROR) 218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_msginfo vdpp_msg; 220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgcode=VDPP_MSG_EVT_HW_ERROR; 221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.status_code=VDPP_S_SUCCESS; 222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" SYS Error Recieved \n"); 223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omx->async_message_process(input,&vdpp_msg) < 0) 224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" async_message_thread Exited \n"); 226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (dqevent.type == VPU_EVENT_FLUSH_DONE) { 230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_msginfo vdpp_msg; 231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin enum v4l2_buf_type buf_type; 232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(&buf_type, dqevent.u.data, sizeof(buf_type)); 233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE == buf_type) 234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgcode=VDPP_MSG_RESP_FLUSH_INPUT_DONE; 236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.status_code=VDPP_S_SUCCESS; 237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VDPP Input Flush Done Recieved \n"); 238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omx->async_message_process(input,&vdpp_msg) < 0) { 239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("\n async_message_thread Exited \n"); 240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE == buf_type) 244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgcode=VDPP_MSG_RESP_FLUSH_OUTPUT_DONE; 246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.status_code=VDPP_S_SUCCESS; 247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VDPP Output Flush Done Recieved \n"); 248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omx->async_message_process(input,&vdpp_msg) < 0) { 249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("\n async_message_thread Exited \n"); 250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Wrong buf_type recieved %d\n", buf_type); 256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(dqevent.type == VPU_EVENT_ACTIVE_REGION_CHANGED) 259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" VPU_EVENT_ACTIVE_REGION_CHANGED\n"); 261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_msginfo vdpp_msg; 262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgcode=VDPP_MSG_EVT_ACTIVE_REGION_DETECTION_STATUS; 263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.status_code=VDPP_S_SUCCESS; 264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // get the active region dection result struct from the event associated data 266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(&vdpp_msg.msgdata.ar_result, dqevent.u.data, sizeof(v4l2_rect)); 267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" VPU_EVENT_ACTIVE_REGION_CHANGED Recieved \n"); 268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(omx->m_ar_callback_setup) 269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omx->async_message_process(input,&vdpp_msg) < 0) 271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" async_message_thread Exited \n"); 273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" VPU Some Event recieved \n"); 280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin continue; 281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("omx_vdpp: Async thread stop\n"); 286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return NULL; 287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else // use stub to simulate vpu events for now 289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid* async_message_thread (void *input) 290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *buffer; 292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_plane plane[VIDEO_MAX_PLANES]; 293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct pollfd pfd; 294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_buffer v4l2_buf; 295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset((void *)&v4l2_buf,0,sizeof(v4l2_buf)); 296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_event dqevent; 297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp *omx = reinterpret_cast<omx_vdpp*>(input); 298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pfd.fd = omx->drv_ctx.video_vpu_fd; 301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0; 302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("omx_vdpp: Async thread start\n"); 303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prctl(PR_SET_NAME, (unsigned long)"VdppCallBackThread", 0, 0, 0); 304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (1) 305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("omx_vdpp: Async thread start 0\n"); 307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_wait(&(omx->drv_ctx.async_lock)); 308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("omx_vdpp: Async thread start pfd.revents = %d\n", pfd.revents); 309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((omx->drv_ctx.etb_ftb_info.ftb_cnt > 0)) 310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_msginfo vdpp_msg; 313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p1 = 0; 314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p2 = 0; 315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned ident = 0; 316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.memory = V4L2_MEMORY_USERPTR; 318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->m_index_q_ftb.pop_entry(&p1,&p2,&ident); 319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.index = ident; 320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.bytesused = omx->drv_ctx.etb_ftb_info.ftb_len; 321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->drv_ctx.etb_ftb_info.ftb_cnt--; 322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) */{ 324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("async_message_thread 2\n", rc); 325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgcode=VDPP_MSG_RESP_OUTPUT_BUFFER_DONE; 326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.status_code=VDPP_S_SUCCESS; 327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf; 328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgdata.output_frame.len=v4l2_buf.bytesused; 329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgdata.output_frame.bufferaddr=(void*)v4l2_buf.m.userptr; 330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) + 332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (uint64_t)v4l2_buf.timestamp.tv_usec; 333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omx->async_message_process(input,&vdpp_msg) < 0) { 334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" async_message_thread Exited \n"); 335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(omx->drv_ctx.etb_ftb_info.etb_cnt > 0) { 340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_msginfo vdpp_msg; 341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p1 = 0; 342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p2 = 0; 343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned ident = 0; 344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.memory = V4L2_MEMORY_USERPTR; 346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->m_index_q_etb.pop_entry(&p1,&p2,&ident); 348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf.index = ident; 349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->drv_ctx.etb_ftb_info.etb_cnt--; 351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf))*/ { 354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgcode=VDPP_MSG_RESP_INPUT_BUFFER_DONE; 355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.status_code=VDPP_S_SUCCESS; 356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf; 357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omx->async_message_process(input,&vdpp_msg) < 0) { 358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" async_message_thread Exited \n"); 359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(omx->drv_ctx.thread_exit) 365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("omx_vdpp: Async thread stop\n"); 370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return NULL; 371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid* message_thread(void *input) 375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp* omx = reinterpret_cast<omx_vdpp*>(input); 377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned char id; 378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int n; 379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp: message thread start\n"); 381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prctl(PR_SET_NAME, (unsigned long)"VideoPostProcessingMsgThread", 0, 0, 0); 382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (1) 383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin n = read(omx->m_pipe_in, &id, 1); 386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(0 == n) 388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (1 == n) 393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->process_event_cb(omx, id); 395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((n < 0) && (errno != EINTR)) 397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: read from pipe failed, ret %d errno %d", n, errno); 399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("omx_vdpp: message thread stop\n"); 403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return 0; 404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid post_message(omx_vdpp *omx, unsigned char id) 407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int ret_value; 409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp: post_message %d pipe out 0x%x\n", id,omx->m_pipe_out); 410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret_value = write(omx->m_pipe_out, &id, 1); 411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_HIGH("post_message to pipe done %d\n",ret_value); 412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// omx_cmd_queue destructor 415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_vdpp::omx_cmd_queue::~omx_cmd_queue() 416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Nothing to do 418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// omx cmd queue constructor 421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_vdpp::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0) 422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE); 424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// omx cmd queue insert 427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id) 428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool ret = true; 430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE) 431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_q[m_write].id = id; 433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_q[m_write].param1 = p1; 434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_q[m_write].param2 = p2; 435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_write++; 436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_size ++; 437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) 438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_write = 0; 440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = false; 445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__); 446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return ret; 448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// omx cmd queue pop 451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id) 452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool ret = true; 454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_size > 0) 455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *id = m_q[m_read].id; 457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p1 = m_q[m_read].param1; 458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p2 = m_q[m_read].param2; 459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Move the read pointer ahead 460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ++m_read; 461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin --m_size; 462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) 463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_read = 0; 465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = false; 470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return ret; 472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// Retrieve the first mesg type in the queue 475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinunsigned omx_vdpp::omx_cmd_queue::get_q_msg_type() 476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return m_q[m_read].id; 478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _ANDROID_ 481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_vdpp::ts_arr_list::ts_arr_list() 482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //initialize timestamps array 484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) ); 485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_vdpp::ts_arr_list::~ts_arr_list() 487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //free m_ts_arr_list? 489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::ts_arr_list::insert_ts(OMX_TICKS ts) 492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool ret = true; 494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool duplicate_ts = false; 495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int idx = 0; 496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //insert at the first available empty location 498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) 499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!m_ts_arr_list[idx].valid) 501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //found invalid or empty entry, save timestamp 503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ts_arr_list[idx].valid = true; 504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ts_arr_list[idx].timestamp = ts; 505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)", 506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ts, idx); 507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) 512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert"); 514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = false; 515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return ret; 517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::ts_arr_list::pop_min_ts(OMX_TICKS &ts) 520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool ret = true; 522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int min_idx = -1; 523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_TICKS min_ts = 0; 524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int idx = 0; 525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) 527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_ts_arr_list[idx].valid) 530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //found valid entry, save index 532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (min_idx < 0) 533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //first valid entry 535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin min_ts = m_ts_arr_list[idx].timestamp; 536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin min_idx = idx; 537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_ts_arr_list[idx].timestamp < min_ts) 539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin min_ts = m_ts_arr_list[idx].timestamp; 541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin min_idx = idx; 542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (min_idx < 0) 548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //no valid entries found 550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop"); 551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ts = 0; 552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = false; 553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ts = m_ts_arr_list[min_idx].timestamp; 557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ts_arr_list[min_idx].valid = false; 558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)", 559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ts, min_idx); 560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return ret; 563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::ts_arr_list::reset_ts_list() 568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool ret = true; 570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int idx = 0; 571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list"); 573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) 574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ts_arr_list[idx].valid = false; 576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return ret; 578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// factory function executed by the core to create instances 582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid *get_omx_component_factory_fn(void) 583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return (new omx_vdpp); 585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 588e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::omx_vdpp 590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 591e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Constructor 593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 594e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None 596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 597e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_vdpp::omx_vdpp(): m_ar_callback_setup(false), 601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_error_propogated(false), 602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state(OMX_StateInvalid), 603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_app_data(NULL), 604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_mem_ptr(NULL), 605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_mem_ptr(NULL), 606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_err_count(0), 607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_flush_progress (false), 608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_flush_progress (false), 609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_use_buffer (false), 610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_use_buffer (false), 611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ouput_egl_buffers(false), 612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_use_output_pmem(OMX_FALSE), 613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_mem_region_smi(OMX_FALSE), 614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_pvt_entry_pmem(OMX_FALSE), 615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_input_buffers(0), 616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_output_buffers(0), 617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_qbuf_count(0), 618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_dqbuf_count(0), 619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_qbuf_count(0), 620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_dqbuf_count(0), 621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef OUTPUT_BUFFER_LOG 622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_buffer_write_counter(0), 623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_buffer_write_counter(0), 624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_bm_count(0), 626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_bm_count(0), 627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_bPopulated(OMX_FALSE), 628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_bPopulated(OMX_FALSE), 629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_flags(0), 630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_bEnabled(OMX_TRUE), 631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_bEnabled(OMX_TRUE), 632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_in_alloc_cnt(0), 633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_platform_list(NULL), 634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_platform_entry(NULL), 635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_pmem_info(NULL), 636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin psource_frame (NULL), 637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pdest_frame (NULL), 638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr (NULL), 639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_phdr_pmem_ptr(NULL), 640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_heap_inp_bm_count (0), 641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prev_ts(LLONG_MAX), 642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rst_prev_ts(true), 643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin frm_int(0), 644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin in_reconfig(false), 645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extradata(0), 646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_enable_android_native_buffers(OMX_FALSE), 647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_use_android_native_buffers(OMX_FALSE), 648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_set_fps(false), 649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin interlace_user_flag(false) 650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("In OMX vdpp Constructor"); 652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_cmp,0,sizeof(m_cmp)); 654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_cb,0,sizeof(m_cb)); 655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset (&drv_ctx,0,sizeof(drv_ctx)); 656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin msg_thread_id = 0; 657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_thread_id = 0; 658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin msg_thread_created = false; 659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_thread_created = false; 660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _ANDROID_ICS_ 661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.timestamp_adjust = false; 665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_vpu_fd = -1; 666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_init(&m_lock, NULL); 667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_init(&m_cmd_lock,0,0); 668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin streaming[CAPTURE_PORT] = false; 669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin streaming[OUTPUT_PORT] = false; 670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB; 672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef STUB_VPU 674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.thread_exit = false; 675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_init(&(drv_ctx.async_lock),0,0); 676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinstatic OMX_ERRORTYPE subscribe_to_events(int fd) 680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_event_subscription sub; 683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc; 684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (fd < 0) { 685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Invalid input: %d\n", fd); 686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sub.type = V4L2_EVENT_ALL; 691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc < 0) 693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x\n", sub.type); 695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorNotImplemented; 696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinstatic OMX_ERRORTYPE unsubscribe_to_events(int fd) 704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_event_subscription sub; 707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc; 709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (fd < 0) { 710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Invalid input: %d\n", fd); 711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&sub, 0, sizeof(sub)); 716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sub.type = V4L2_EVENT_ALL; 717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc) { 719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x\n", sub.type); 720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 727e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::~omx_vdpp 729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 730e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Destructor 732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 733e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None 735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 736e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_vdpp::~omx_vdpp() 740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_pmem_info = NULL; 742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("In OMX vdpp Destructor"); 743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_pipe_in) close(m_pipe_in); 744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_pipe_out) close(m_pipe_out); 745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_pipe_in = -1; 746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_pipe_out = -1; 747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit"); 748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (msg_thread_created) 749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_join(msg_thread_id,NULL); 750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit"); 751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef STUB_VPU 753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.etb_ftb_info.ftb_cnt = 0; 755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.etb_ftb_info.etb_cnt = 0; 756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post (&(drv_ctx.async_lock)); 757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.thread_exit = true; 758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // notify async thread to exit 760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("write control pipe to notify async thread to exit"); 761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin write(m_ctrl_out, "1", 1); 762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (async_thread_created) 764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_join(async_thread_id,NULL); 765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("async_thread exits"); 766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsubscribe_to_events(drv_ctx.video_vpu_fd); 767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(drv_ctx.video_vpu_fd); 768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_destroy(&m_lock); 769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_destroy(&m_cmd_lock); 770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef STUB_VPU 772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_destroy(&(drv_ctx.async_lock)); 773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_ctrl_in) close(m_ctrl_in); 775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_ctrl_out) close(m_ctrl_out); 776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ctrl_in = -1; 777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ctrl_out = -1; 778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Exit OMX vdpp Destructor"); 779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint release_buffers(omx_vdpp* obj, enum vdpp_buffer buffer_type) { 782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_requestbuffers bufreq; 783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc = 0; 784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buffer_type == VDPP_BUFFER_TYPE_OUTPUT){ 786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.memory = V4L2_MEMORY_USERPTR; 787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.count = 0; 788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(obj->drv_ctx.video_vpu_fd,VIDIOC_REQBUFS, &bufreq); 790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin }else if(buffer_type == VDPP_BUFFER_TYPE_INPUT) { 791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.memory = V4L2_MEMORY_USERPTR; 792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.count = 0; 793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(obj->drv_ctx.video_vpu_fd,VIDIOC_REQBUFS, &bufreq); 795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 801e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::process_event_cb 803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 804e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin IL Client callbacks are generated through this routine. The VDPP 806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin provides the thread context for this routine. 807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 808e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ctxt -- Context information related to the self. 810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin id -- Event identifier. This could be any of the following: 811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1. Command completion event 812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2. Buffer done callback event 813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3. Frame done callback event 814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 815e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdpp::process_event_cb(void *ctxt, unsigned char id) 820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin signed p1; // Parameter - 1 822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin signed p2; // Parameter - 2 823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned ident; 824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned qsize=0; // qsize 825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp *pThis = (omx_vdpp *) ctxt; 826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!pThis) 828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n", 830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin __func__); 831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return; 832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Protect the shared queue data structure 835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin do 836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Read the message id's from the queue*/ 838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_lock(&pThis->m_lock); 839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // first check command queue 841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin qsize = pThis->m_cmd_q.m_size; 842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(qsize) 843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_HIGH("process_event_cb m_cmd_q.pop_entry ident = %d", ident); 846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // then check ftb queue 849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (qsize == 0 && pThis->m_state != OMX_StatePause) 850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin qsize = pThis->m_ftb_q.m_size; 853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (qsize) 854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("process_event_cb, p1 = 0x%08x, p2 = 0x%08x, ident = 0x%08x", p1, p2, ident); 857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // last check etb queue 861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (qsize == 0 && pThis->m_state != OMX_StatePause) 862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin qsize = pThis->m_etb_q.m_size; 864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (qsize) 865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident); 867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_unlock(&pThis->m_lock); 870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*process message if we have one*/ 872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(qsize > 0) 873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin id = ident; 875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (id) 876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_EVENT: 878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_cb.EventHandler) 879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (p1) 881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandStateSet: 883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_state = (OMX_STATETYPE) p2; 884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" OMX_CommandStateSet complete, m_state = %d, pThis->m_cb.EventHandler = %p", 885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_state, pThis->m_cb.EventHandler); 886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventCmdComplete, p1, p2, NULL); 888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_EventError: 891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(p2 == OMX_StateInvalid) 892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" OMX_EventError: p2 is OMX_StateInvalid"); 894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_state = (OMX_STATETYPE) p2; 895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventError, OMX_ErrorInvalidState, p2, NULL); 897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p2 == OMX_ErrorHardware) 899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error(); 901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventError, p2, (OMX_U32)NULL, NULL ); 906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandPortDisable: 910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" OMX_CommandPortDisable complete for port [%d], pThis->in_reconfig = %d", p2, pThis->in_reconfig); 911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (BITMASK_PRESENT(&pThis->m_flags, 912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) 913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p2 == OMX_CORE_OUTPUT_PORT_INDEX) 918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(release_buffers(pThis, VDPP_BUFFER_TYPE_OUTPUT)) 922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Failed to release output buffers\n"); 923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf); 924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->in_reconfig = false; 925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eRet != OMX_ErrorNone) 926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error(); 929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p2 == OMX_CORE_INPUT_PORT_INDEX) 933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX); 936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(release_buffers(pThis, VDPP_BUFFER_TYPE_INPUT)) 937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Failed to release output buffers\n"); 938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.ip_buf); 939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->in_reconfig = false; 940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eRet != OMX_ErrorNone) 941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet); 943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error(); 944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventCmdComplete, p1, p2, NULL ); 949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandPortEnable: 951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" OMX_CommandPortEnable complete for port [%d]", p2); 952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ 953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventCmdComplete, p1, p2, NULL ); 954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventCmdComplete, p1, p2, NULL ); 959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__); 966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_ETB: 970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) 972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" empty_this_buffer_proxy failure"); 974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_FTB: 979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("OMX_COMPONENT_GENERATE_FTB p2 = 0x%08x", p2); 981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) 983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" fill_this_buffer_proxy failure"); 985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_COMMAND: 991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\ 992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_U32)p2,(OMX_PTR)NULL); 993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_EBD: 996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p2 != VDPP_S_SUCCESS && p2 != VDPP_S_INPUT_BITSTREAM_ERR) 997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" OMX_COMPONENT_GENERATE_EBD failure"); 999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" OMX_COMPONENT_GENERATE_EBD 1"); 1004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p2 == VDPP_S_INPUT_BITSTREAM_ERR && p1) 1005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_inp_err_count++; 1007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" OMX_COMPONENT_GENERATE_EBD 2"); 1008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //pThis->time_stamp_dts.remove_time_stamp( 1009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp, 1010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //(pThis->drv_ctx.interlace != VDPP_InterlaceFrameProgressive) 1011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // ?true:false); 1012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_inp_err_count = 0; 1016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ( pThis->empty_buffer_done(&pThis->m_cmp, 1018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) 1019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" empty_buffer_done failure"); 1021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_EBD 4"); 1024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(pThis->m_inp_err_count >= MAX_INPUT_ERROR) 1025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR); 1027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_FBD: 1032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p2 != VDPP_S_SUCCESS) 1033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_FBD failure"); 1035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if ( pThis->fill_buffer_done(&pThis->m_cmp, 1038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) 1039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" fill_buffer_done failure"); 1041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH: 1046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Driver flush i/p Port complete"); 1047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!pThis->input_flush_progress) 1048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" WARNING: Unexpected flush from driver"); 1050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->execute_input_flush(); 1054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_cb.EventHandler) 1055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p2 != VDPP_S_SUCCESS) 1057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure"); 1059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Check if we need generate event for Flush done*/ 1064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT(&pThis->m_flags, 1065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_INPUT_FLUSH_PENDING)) 1066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING); 1068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Input Flush completed - Notify Client"); 1069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventCmdComplete,OMX_CommandFlush, 1071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_INPUT_PORT_INDEX,NULL ); 1072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (BITMASK_PRESENT(&pThis->m_flags, 1074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_IDLE_PENDING)) 1075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) { 1077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Failed to call streamoff on OUTPUT Port \n"); 1078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 1080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Successful to call streamoff on OUTPUT Port \n"); 1081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->streaming[OUTPUT_PORT] = false; 1082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!pThis->output_flush_progress) 1084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Input flush done hence issue stop"); 1086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->post_event ((unsigned int)NULL, VDPP_S_SUCCESS,\ 1087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_STOP_DONE); 1088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH: 1100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Driver flush o/p Port complete"); 1101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!pThis->output_flush_progress) 1102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" WARNING: Unexpected flush from driver"); 1104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->execute_output_flush(); 1108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_cb.EventHandler) 1109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p2 != VDPP_S_SUCCESS) 1111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed"); 1113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Check if we need generate event for Flush done*/ 1118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT(&pThis->m_flags, 1119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) 1120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Notify Output Flush done"); 1122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 1123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventCmdComplete,OMX_CommandFlush, 1125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_OUTPUT_PORT_INDEX,NULL ); 1126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT(&pThis->m_flags, 1128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) 1129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Internal flush complete"); 1131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR (&pThis->m_flags, 1132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 1133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (BITMASK_PRESENT(&pThis->m_flags, 1134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) 1135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->post_event(OMX_CommandPortDisable, 1137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_OUTPUT_PORT_INDEX, 1138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 1139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR (&pThis->m_flags, 1140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED); 1141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH 1 \n"); 1146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) 1148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH 2 \n"); 1150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) { 1151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Failed to call streamoff on CAPTURE Port \n"); 1152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->streaming[CAPTURE_PORT] = false; 1156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH 3 pThis->input_flush_progress =%d \n", pThis->input_flush_progress); 1157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!pThis->input_flush_progress) 1158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Output flush done hence issue stop"); 1160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->post_event ((unsigned int)NULL, VDPP_S_SUCCESS,\ 1161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_STOP_DONE); 1162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_START_DONE: 1174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_START_DONE"); 1175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_cb.EventHandler) 1177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p2 != VDPP_S_SUCCESS) 1179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_START_DONE Failure"); 1181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_START_DONE Success"); 1186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) 1187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Move to executing"); 1189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Send the callback now 1190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 1191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_state = OMX_StateExecuting; 1192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventCmdComplete,OMX_CommandStateSet, 1194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_StateExecuting, NULL); 1195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (BITMASK_PRESENT(&pThis->m_flags, 1197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_PAUSE_PENDING)) 1198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (/*ioctl (pThis->drv_ctx.video_vpu_fd, 1200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin VDPP_IOCTL_CMD_PAUSE,NULL ) < */0) 1201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" VDPP_IOCTL_CMD_PAUSE failed"); 1203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Event Handler callback is NULL"); 1211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_PAUSE_DONE: 1215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE"); 1216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_cb.EventHandler) 1217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p2 != VDPP_S_SUCCESS) 1219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed"); 1221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->complete_pending_buffer_done_cbs(); 1226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) 1227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_PAUSE_DONE nofity"); 1229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //Send the callback now 1230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING); 1231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_state = OMX_StatePause; 1232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventCmdComplete,OMX_CommandStateSet, 1234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_StatePause, NULL); 1235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_RESUME_DONE: 1246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_RESUME_DONE"); 1247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_cb.EventHandler) 1248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p2 != VDPP_S_SUCCESS) 1250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_RESUME_DONE failed"); 1252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) 1257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Moving the VDPP to execute state"); 1259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Send the callback now 1260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 1261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_state = OMX_StateExecuting; 1262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventCmdComplete,OMX_CommandStateSet, 1264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_StateExecuting,NULL); 1265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_STOP_DONE: 1276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_STOP_DONE"); 1277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_cb.EventHandler) 1278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p2 != VDPP_S_SUCCESS) 1280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_STOP_DONE ret failed"); 1282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->complete_pending_buffer_done_cbs(); 1287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) 1288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_STOP_DONE Success"); 1290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Send the callback now 1291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING); 1292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_state = OMX_StateIdle; 1293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Move to Idle State, pThis->m_cb.EventHandler = %p", pThis->m_cb.EventHandler); 1294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data, 1295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventCmdComplete,OMX_CommandStateSet, 1296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_StateIdle,NULL); 1297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" OMX_COMPONENT_GENERATE_STOP_DONE cb finished"); 1298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_PORT_RECONFIG: 1309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG"); 1310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p2 == OMX_IndexParamPortDefinition) { 1312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->in_reconfig = true; 1313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_cb.EventHandler) { 1315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventPortSettingsChanged, p1, p2, NULL ); 1317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 1318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->drv_ctx.interlace != V4L2_FIELD_NONE/*VDPP_InterlaceFrameProgressive*/) 1322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1; 1324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged; 1325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->drv_ctx.interlace == V4L2_FIELD_INTERLACED_TB/*VDPP_InterlaceInterleaveFrameTopFieldFirst*/) 1326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin format = OMX_InterlaceInterleaveFrameTopFieldFirst; 1327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (pThis->drv_ctx.interlace == V4L2_FIELD_INTERLACED_BT/*VDPP_InterlaceInterleaveFrameBottomFieldFirst*/) 1328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin format = OMX_InterlaceInterleaveFrameBottomFieldFirst; 1329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else //unsupported interlace format; raise a error 1330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin event = OMX_EventError; 1331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_cb.EventHandler) { 1332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin event, format, 0, NULL ); 1334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 1335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_EOS_DONE: 1341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_EOS_DONE"); 1342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_cb.EventHandler) { 1343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag, 1344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL ); 1345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 1346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->prev_ts = LLONG_MAX; 1349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->rst_prev_ts = true; 1350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 1353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_HARDWARE_ERROR"); 1354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_error (); 1355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING: 1358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING\n"); 1359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->omx_report_unsupported_setting(); 1360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG: 1363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG"); 1365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_cb.EventHandler) { 1366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL ); 1368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 1369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // extensions 1373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_ACTIVE_REGION_DETECTION_STATUS: 1374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_rect * ar_result = (struct v4l2_rect *) p1; 1376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_ACTIVEREGIONDETECTION_STATUSTYPE arstatus; 1377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin arstatus.nSize = sizeof(QOMX_ACTIVEREGIONDETECTION_STATUSTYPE); 1378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin arstatus.nPortIndex = 0; 1379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin arstatus.bDetected = OMX_TRUE; 1380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(&arstatus.sDetectedRegion, ar_result, sizeof(QOMX_RECTTYPE)); 1381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" OMX_COMPONENT_GENERATE_ACTIVE_REGION_DETECTION_STATUS"); 1382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // data2 should be (OMX_INDEXTYPE)OMX_QcomIndexConfigActiveRegionDetectionStatus 1383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // pdata should be QOMX_ACTIVEREGIONDETECTION_STATUSTYPE 1384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_cb.EventHandler) { 1385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, 1386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, (OMX_INDEXTYPE)OMX_QcomIndexConfigActiveRegionDetectionStatus, &arstatus); 1387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 1388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__); 1389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 1392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_lock(&pThis->m_lock); 1396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin qsize = pThis->m_cmd_q.m_size; 1397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pThis->m_state != OMX_StatePause) 1398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size); 1399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_unlock(&pThis->m_lock); 1400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while(qsize>0); 1402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_vdpp::update_resolution(uint32_t width, uint32_t height, uint32_t stride, uint32_t scan_lines) 1406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int format_changed = 0; 1408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((height != drv_ctx.video_resolution_input.frame_height) || 1409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (width != drv_ctx.video_resolution_input.frame_width)) { 1410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("NOTE: W/H %d (%d), %d (%d)\n", 1411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin width, drv_ctx.video_resolution_input.frame_width, 1412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin height,drv_ctx.video_resolution_input.frame_height); 1413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin format_changed = 1; 1414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.frame_height = height; 1416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.frame_width = width; 1417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.scan_lines = scan_lines; 1418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.stride = stride; 1419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rectangle.nLeft = 0; 1420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rectangle.nTop = 0; 1421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rectangle.nWidth = drv_ctx.video_resolution_input.frame_width; 1422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rectangle.nHeight = drv_ctx.video_resolution_input.frame_height; 1423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return format_changed; 1424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 1427e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 1428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::ComponentInit 1429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1430e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 1431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Initialize the component. 1432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1433e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 1434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ctxt -- Context information related to the self. 1435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin id -- Event identifier. This could be any of the following: 1436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1. Command completion event 1437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2. Buffer done callback event 1438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3. Frame done callback event 1439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1440e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 1441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 1442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 1444e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::component_init(OMX_STRING role) 1445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 1448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_format fmt; 1449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int fds[2]; 1450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int fctl[2]; 1451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int ret=0; 1452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int i = 0; 1453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int sessionNum = 0; 1454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin errno = 0; 1456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 1458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_vpu_fd = openInput("msm_vpu"); 1459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else 1460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_vpu_fd = 1; 1461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 1462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" omx_vdpp::component_init(): Open returned fd %d, errno %d", 1463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_vpu_fd, errno); 1464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.video_vpu_fd == 0){ 1466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("omx_vdpp:: Got fd as 0 for vpu, Opening again\n"); 1467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_vpu_fd = openInput("msm_vpu"); 1468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.video_vpu_fd < 0) 1471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("omx_vdpp::Comp Init Returning failure, errno %d\n", errno); 1473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 1474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 1477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // query number of sessions and attach to session #1 1478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Check how many sessions are suported by H/W */ 1479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd, VPU_QUERY_SESSIONS, 1480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &drv_ctx.sessionsSupported); 1481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret < 0) 1482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("QUERY_SESSIONS: VPU_QUERY_SESSIONS failed."); 1484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(drv_ctx.video_vpu_fd); 1485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_vpu_fd = 0; 1486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 1487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("QUERY_SESSIONS: The number of sessions supported are %d.", 1491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.sessionsSupported); 1492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 1494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Attach Client to Session. */ 1496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sessionNum = VDPP_SESSION; 1497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 1499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd, VPU_ATTACH_TO_SESSION, &sessionNum); 1500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret < 0) 1501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if( errno == EINVAL ) 1503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("VPU_ATTACH_TO_SESSION: session %d is out of valid " 1504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "range.", sessionNum); 1505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if( errno == EBUSY) 1506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("VPU_ATTACH_TO_SESSION: max. allowed number of" 1507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "clients attached to session."); 1508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("VPU_ATTACH_TO_SESSION: failed for unknown reason."); 1510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorUndefined; 1511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VPU_ATTACH_TO_SESSION: client successfully attached " 1515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "to session."); 1516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 1518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.sessionAttached = sessionNum; 1519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS; 1521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_denominator = 1; 1522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = subscribe_to_events(drv_ctx.video_vpu_fd); 1524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* create control pipes */ 1526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!ret) 1527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(pipe(fctl)) 1529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("pipe creation failed\n"); 1531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 1532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int temp2[2]; 1536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(fctl[0] == 0 || fctl[1] == 0) 1537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pipe (temp2)) 1539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("pipe creation failed\n"); 1541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 1542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fctl[0] = temp2 [0]; 1544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fctl[1] = temp2 [1]; 1545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ctrl_in = fctl[0]; 1547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ctrl_out = fctl[1]; 1548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fcntl(m_ctrl_in, F_SETFL, O_NONBLOCK); 1550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fcntl(m_ctrl_out, F_SETFL, O_NONBLOCK); 1551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!ret) { 1555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_thread_created = true; 1556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = pthread_create(&async_thread_id,0,async_message_thread,this); 1557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ret) { 1559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Failed to create async_message_thread \n"); 1560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_thread_created = false; 1561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 1562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef INPUT_BUFFER_LOG 1565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin inputBufferFile = open(inputfilename, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR | S_IWUSR); 1566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(inputBufferFile < 0) 1567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Failed to create inputBufferFile 0, errno = %d\n", errno); 1569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 1572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef OUTPUT_BUFFER_LOG 1574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin outputBufferFile = open(outputfilename, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR | S_IWUSR); 1575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(outputBufferFile < 0) 1576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Failed to create outputBufferFile 0 , errno = %d\n", errno); 1578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 1580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef OUTPUT_EXTRADATA_LOG 1582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin outputExtradataFile = open (ouputextradatafilename, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR | S_IWUSR); 1583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(outputExtradataFile == -1) 1584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Failed to create outputExtradataFile , errno = %d\n", errno); 1586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 1588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Copy the role information which provides the vdpp kind 1590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy(drv_ctx.kind,role,128); 1591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Default set to progressive mode for 8084. drv_ctx.interlace will be changed by 1593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // interlace format filed of OMX buffer header extra data. User can also overwrite 1594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // this setting by OMX_IndexParamInterlaceFormat 1595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.interlace = V4L2_FIELD_NONE; 1596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Default input pixel format 1598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_capability=V4L2_PIX_FMT_NV12; 1599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (eRet == OMX_ErrorNone) 1601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // set default output format to V4L2_PIX_FMT_NV12. User can use SetParam 1603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // with OMX_IndexParamVideoPortFormat to set vdpp output format 1604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_format = V4L2_PIX_FMT_NV12; 1605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin capture_capability = V4L2_PIX_FMT_NV12; 1606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_capability cap; 1608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 1609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_QUERYCAP, &cap); 1610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret) { 1611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to query capabilities\n"); 1612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorUndefined; 1613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 1614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s," 1615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " version = %d, capabilities = %x\n", cap.driver, cap.card, 1616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin cap.bus_info, cap.version, cap.capabilities); 1617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((cap.capabilities & V4L2_CAP_STREAMING) == 0) 1619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("device does not support streaming i/o\n"); 1621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 1622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 1625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // set initial input h/w and pixel format 1626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin update_resolution(640, 480, 640, 480); 1627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height = drv_ctx.video_resolution_input.frame_height; 1630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width = drv_ctx.video_resolution_input.frame_width; 1631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (V4L2_FIELD_NONE == drv_ctx.interlace) 1632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 1634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_INTERLACED; 1638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = output_capability; 1640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // NV12 has 2 planes. 1642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Set format for each plane. */ 1643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin setFormatParams(output_capability, drv_ctx.input_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 1644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 1645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.input_bytesperpixel[i] * fmt.fmt.pix_mp.height); 1647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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 1648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" fmt.fmt.pix_mp.plane_fmt[%d].sizeimage = %d \n ", i, fmt.fmt.pix_mp.plane_fmt[i].sizeimage); 1649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 1651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 1652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret) { 1654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to set format on output port\n"); 1655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorUndefined; 1656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Set Format was successful drv_ctx.interlace = %d\n ", drv_ctx.interlace); 1658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 1659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // set initial output format 1660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // initial input/output resolution are the same. portdefinition changes both 1661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&fmt, 0, sizeof(fmt)); 1662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height = drv_ctx.video_resolution_input.frame_height; 1665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width = drv_ctx.video_resolution_input.frame_width; 1666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 1667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = capture_capability; 1668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VP output frame width = %d, height = %d", fmt.fmt.pix_mp.width, 1669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height); 1670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin setFormatParams(capture_capability, drv_ctx.output_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 1672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 1673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * 1675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_bytesperpixel[i] * 1676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height); 1677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[i].bytesperline = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.output_bytesperpixel[0]); 1678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" fmt.fmt.pix_mp.plane_fmt[%d].sizeimage = %d \n ", i, fmt.fmt.pix_mp.plane_fmt[i].sizeimage); 1679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 1681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 1682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret < 0) 1683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("VIDIOC_S_FMT setup VP output format error"); 1685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorUndefined; 1686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 1688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // update initial output resolution 1689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_height = fmt.fmt.pix_mp.height; 1690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_width = fmt.fmt.pix_mp.width; 1691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.scan_lines = fmt.fmt.pix_mp.height; 1692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.stride = fmt.fmt.pix_mp.width; 1693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret) { 1695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to set format on capture port\n"); 1696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorUndefined; 1697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Set Format was successful \n "); 1699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Get the Buffer requirements for input and output ports*/ 1701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.buffer_type = VDPP_BUFFER_TYPE_INPUT; 1702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.buffer_type = VDPP_BUFFER_TYPE_OUTPUT; 1703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.alignment=SZ_4K; 1705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.alignment=SZ_4K; 1706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state = OMX_StateLoaded; 1708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet=get_buffer_req(&drv_ctx.ip_buf); 1710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size); 1711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin get_buffer_req(&drv_ctx.op_buf); 1712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* create pipes for message thread*/ 1714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(pipe(fds)) 1715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("pipe creation failed\n"); 1717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 1718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int temp1[2]; 1722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(fds[0] == 0 || fds[1] == 0) 1723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pipe (temp1)) 1725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("pipe creation failed\n"); 1727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 1728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fds[0] = temp1 [0]; 1730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fds[1] = temp1 [1]; 1731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_pipe_in = fds[0]; 1733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_pipe_out = fds[1]; 1734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin msg_thread_created = true; 1735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = pthread_create(&msg_thread_id,0,message_thread,this); 1736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ret < 0) 1738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" component_init(): message_thread creation failed"); 1740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin msg_thread_created = false; 1741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 1742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (eRet != OMX_ErrorNone) 1747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Component Init Failed"); 1749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" omx_vdpp::component_init() success"); 1753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 1756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 1759e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 1760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::GetComponentVersion 1761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1762e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 1763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Returns the component version. 1764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1765e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 1766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin TBD. 1767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1768e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 1769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorNone. 1770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 1772e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::get_component_version 1773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ( 1774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_HANDLETYPE hComp, 1775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_OUT OMX_STRING componentName, 1776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_OUT OMX_VERSIONTYPE* componentVersion, 1777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_OUT OMX_VERSIONTYPE* specVersion, 1778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_OUT OMX_UUIDTYPE* componentUUID 1779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ) 1780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StateInvalid) 1782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n"); 1784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInvalidState; 1785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* TBD -- Return the proper version */ 1787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (specVersion) 1788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin specVersion->nVersion = OMX_SPEC_VERSION; 1790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 1792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 1794e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 1795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::SendCommand 1796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1797e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 1798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Returns zero if all the buffers released.. 1799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1800e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 1801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 1802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1803e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 1804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 1805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 1807e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::send_command(OMX_IN OMX_HANDLETYPE hComp, 1808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_COMMANDTYPE cmd, 1809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 param1, 1810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR cmdData 1811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ) 1812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" send_command: Recieved a Command from Client cmd = %d", cmd); 1814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StateInvalid) 1815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n"); 1817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInvalidState; 1818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX 1820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) 1821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" send_command(): ERROR OMX_CommandFlush " 1823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "to invalid port: %lu", param1); 1824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadPortIndex; 1825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND); 1827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_wait(&m_cmd_lock); 1828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" send_command: Command Processed cmd = %d\n", cmd); 1829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 1830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 1833e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 1834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::SendCommand 1835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1836e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 1837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Returns zero if all the buffers released.. 1838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1839e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 1840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 1841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1842e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 1843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 1844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 1846e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, 1847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_COMMANDTYPE cmd, 1848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 param1, 1849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR cmdData 1850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ) 1851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 1853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE eState = (OMX_STATETYPE) param1; 1854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int bFlag = 1,sem_posted = 0,ret=0; 1855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" send_command_proxy(): cmd = %d", cmd); 1857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("end_command_proxy(): Current State %d, Expected State %d", 1858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state, eState); 1859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(cmd == OMX_CommandStateSet) 1861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued"); 1863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState); 1864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /***************************/ 1865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Current State is Loaded */ 1866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /***************************/ 1867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StateLoaded) 1868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eState == OMX_StateIdle) 1870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //if all buffers are allocated or all ports disabled 1872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(allocate_done() || 1873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) 1874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n"); 1876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n"); 1880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING); 1881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Skip the event notification 1882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 0; 1883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Loaded to Loaded */ 1886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateLoaded) 1887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n"); 1889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorSameState,\ 1890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 1891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorSameState; 1892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Loaded to WaitForResources */ 1894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateWaitForResources) 1895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Since error is None , we will post an event 1897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin at the end of this function definition */ 1898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n"); 1899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Loaded to Executing */ 1901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateExecuting) 1902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n"); 1904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 1906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorIncorrectStateTransition; 1907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Loaded to Pause */ 1909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StatePause) 1910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n"); 1912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 1914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorIncorrectStateTransition; 1915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Loaded to Invalid */ 1917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateInvalid) 1918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n"); 1920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 1921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInvalidState; 1922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\ 1926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eState); 1927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 1928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /***************************/ 1932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Current State is IDLE */ 1933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /***************************/ 1934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(m_state == OMX_StateIdle) 1935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eState == OMX_StateLoaded) 1937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(release_done()) 1939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* 1941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Since error is None , we will post an event at the end 1942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin of this function definition 1943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 1944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n"); 1945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n"); 1949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING); 1950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Skip the event notification 1951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 0; 1952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Idle to Executing */ 1955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateExecuting) 1956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 1958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING); 1959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 1; 1960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state=OMX_StateExecuting; 1961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful\n"); 1962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Idle to Idle */ 1964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateIdle) 1965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n"); 1967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorSameState,\ 1968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 1969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorSameState; 1970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Idle to WaitForResources */ 1972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateWaitForResources) 1973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n"); 1975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 1976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 1977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorIncorrectStateTransition; 1978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Idle to Pause */ 1980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StatePause) 1981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*To pause the Video core we need to start the driver*/ 1983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (/*ioctl (drv_ctx.video_vpu_fd,VDPP_IOCTL_CMD_START, 1984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin NULL) < */0) 1985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" VDPP_IOCTL_CMD_START FAILED"); 1987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_report_error (); 1988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorHardware; 1989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 1993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n"); 1994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 0; 1995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Idle to Invalid */ 1998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateInvalid) 1999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n"); 2001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 2002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInvalidState; 2003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState); 2007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 2008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /******************************/ 2012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Current State is Executing */ 2013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /******************************/ 2014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(m_state == OMX_StateExecuting) 2015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Command Recieved in OMX_StateExecuting"); 2017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Executing to Idle */ 2018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eState == OMX_StateIdle) 2019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Since error is None , we will post an event 2021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin at the end of this function definition 2022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" send_command_proxy(): Executing --> Idle \n"); 2024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 2025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!sem_posted) 2026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_posted = 1; 2028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post (&m_cmd_lock); 2029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin execute_omx_flush(OMX_ALL); 2030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 0; 2032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Executing to Paused */ 2034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StatePause) 2035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" PAUSE Command Issued"); 2037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state = OMX_StatePause; 2038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 1; 2039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Executing to Loaded */ 2041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateLoaded) 2042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" send_command_proxy(): Executing --> Loaded \n"); 2044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 2045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorIncorrectStateTransition; 2047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Executing to WaitForResources */ 2049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateWaitForResources) 2050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" send_command_proxy(): Executing --> WaitForResources \n"); 2052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 2053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorIncorrectStateTransition; 2055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Executing to Executing */ 2057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateExecuting) 2058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" send_command_proxy(): Executing --> Executing \n"); 2060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorSameState,\ 2061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorSameState; 2063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Executing to Invalid */ 2065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateInvalid) 2066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" send_command_proxy(): Executing --> Invalid \n"); 2068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 2069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInvalidState; 2070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState); 2074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 2075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /***************************/ 2078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Current State is Pause */ 2079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /***************************/ 2080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(m_state == OMX_StatePause) 2081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Pause to Executing */ 2083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eState == OMX_StateExecuting) 2084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Pause --> Executing \n"); 2086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state = OMX_StateExecuting; 2087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 1; 2088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Pause to Idle */ 2090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateIdle) 2091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Since error is None , we will post an event 2093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin at the end of this function definition */ 2094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Pause --> Idle \n"); 2095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 2096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!sem_posted) 2097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_posted = 1; 2099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post (&m_cmd_lock); 2100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin execute_omx_flush(OMX_ALL); 2101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 0; 2103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Pause to loaded */ 2105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateLoaded) 2106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Pause --> loaded \n"); 2108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 2109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorIncorrectStateTransition; 2111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Pause to WaitForResources */ 2113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateWaitForResources) 2114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Pause --> WaitForResources \n"); 2116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 2117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorIncorrectStateTransition; 2119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Pause to Pause */ 2121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StatePause) 2122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Pause --> Pause \n"); 2124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorSameState,\ 2125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorSameState; 2127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from Pause to Invalid */ 2129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateInvalid) 2130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Pause --> Invalid \n"); 2132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 2133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInvalidState; 2134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState); 2138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 2139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /***************************/ 2142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Current State is WaitForResources */ 2143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /***************************/ 2144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(m_state == OMX_StateWaitForResources) 2145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from WaitForResources to Loaded */ 2147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eState == OMX_StateLoaded) 2148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Since error is None , we will post an event 2150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin at the end of this function definition */ 2151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n"); 2152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from WaitForResources to WaitForResources */ 2154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (eState == OMX_StateWaitForResources) 2155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n"); 2157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorSameState, 2158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorSameState; 2160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from WaitForResources to Executing */ 2162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateExecuting) 2163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n"); 2165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 2166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorIncorrectStateTransition; 2168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from WaitForResources to Pause */ 2170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StatePause) 2171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n"); 2173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 2174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorIncorrectStateTransition; 2176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from WaitForResources to Invalid */ 2178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(eState == OMX_StateInvalid) 2179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n"); 2181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 2182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInvalidState; 2183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Requesting transition from WaitForResources to Loaded - 2185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin is NOT tested by Khronos TS */ 2186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState); 2191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 2192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /********************************/ 2195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Current State is Invalid */ 2196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*******************************/ 2197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(m_state == OMX_StateInvalid) 2198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* State Transition from Inavlid to any state */ 2200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eState == (OMX_StateLoaded || OMX_StateWaitForResources 2201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin || OMX_StateIdle || OMX_StateExecuting 2202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin || OMX_StatePause || OMX_StateInvalid)) 2203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n"); 2205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError,OMX_ErrorInvalidState,\ 2206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInvalidState; 2208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmd == OMX_CommandFlush) 2211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" send_command_proxy(): OMX_CommandFlush issued " 2213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "with param1: 0x%x", param1); 2214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) 2215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { // do not call flush ioctl if there is no buffer queued. Just return callback 2216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU // VPU stub doesn't set any streaming flag 2217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!streaming[OUTPUT_PORT]) 2218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cb.EventHandler(&m_cmp, m_app_data, OMX_EventCmdComplete,OMX_CommandFlush, 2220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_INPUT_PORT_INDEX,NULL ); 2221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_posted = 1; 2222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post (&m_cmd_lock); 2223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 2226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); 2228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) 2231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 2233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!sem_posted){ 2235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_posted = 1; 2236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Set the Semaphore"); 2237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post (&m_cmd_lock); 2238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin execute_omx_flush(param1); 2239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 0; 2241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if ( cmd == OMX_CommandPortEnable) 2243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" send_command_proxy(): OMX_CommandPortEnable issued " 2245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "with param1: %lu", param1); 2246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) 2247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_bEnabled = OMX_TRUE; 2249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if( (m_state == OMX_StateLoaded && 2251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 2252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin || allocate_input_done()) 2253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX, 2255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n"); 2260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING); 2261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Skip the event notification 2262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 0; 2263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) 2266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Enable output Port command recieved"); 2268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_bEnabled = OMX_TRUE; 2269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if( (m_state == OMX_StateLoaded && 2271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 2272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin || (allocate_output_done())) 2273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX, 2275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n"); 2281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 2282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Skip the event notification 2283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 0; 2284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmd == OMX_CommandPortDisable) 2288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" send_command_proxy(): OMX_CommandPortDisable issued" 2290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "with param1: %lu m_state = %d, streaming[OUTPUT_PORT] = %d", param1, m_state, streaming[OUTPUT_PORT]); 2291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) 2292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_bEnabled = OMX_FALSE; 2294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 2295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin && release_input_done()) 2296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX, 2298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("OMX_CommandPortDisable 1"); 2300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING); 2304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("OMX_CommandPortDisable 2"); 2305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting) 2306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!sem_posted) 2308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_posted = 1; 2310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post (&m_cmd_lock); 2311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!streaming[OUTPUT_PORT]) 2313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("OMX_CommandPortDisable 3 "); 2315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //IL client calls disable port and then free buffers. 2316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //from free buffer, disable port done event will be sent 2317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX); 2321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Skip the event notification 2325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 0; 2326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) 2329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_bEnabled = OMX_FALSE; 2331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Disable output Port command recieved m_state = %d", m_state); 2332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 2333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin && release_output_done()) 2334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\ 2336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 2337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 2341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting) 2342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!sem_posted) 2344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_posted = 1; 2346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post (&m_cmd_lock); 2347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING); 2349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX); 2350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Skip the event notification 2352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bFlag = 0; 2353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd); 2360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorNotImplemented; 2361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eRet == OMX_ErrorNone && bFlag) 2363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT); 2365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!sem_posted) 2367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post(&m_cmd_lock); 2369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 2372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 2375e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 2376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::ExecuteOmxFlush 2377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2378e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 2379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Executes the OMX flush. 2380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2381e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 2382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin flushtype - input flush(1)/output flush(0)/ both. 2383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2384e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 2385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 2386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 2388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::execute_omx_flush(OMX_U32 flushType) 2389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool bRet = false; 2391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_requestbuffers bufreq; 2392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_msginfo vdpp_msg; 2393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin enum v4l2_buf_type buf_type; 2394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i = 0; 2395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("in %s flushType = %d", __func__, flushType); 2397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset((void *)&vdpp_msg,0,sizeof(vdpp_msg)); 2398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (flushType) 2400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CORE_INPUT_PORT_INDEX: 2402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_flush_progress = true; 2403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CORE_OUTPUT_PORT_INDEX: 2406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_flush_progress = true; 2407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 2410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_flush_progress = true; 2411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_flush_progress = true; 2412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 2415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // vpu doesn't have flush right now, simulate flush done from here 2416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef STUB_VPU 2417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // dq output 2419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(output_flush_progress) 2420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgcode=VDPP_MSG_RESP_FLUSH_OUTPUT_DONE; 2422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.status_code=VDPP_S_SUCCESS; 2423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Simulate VDPP Output Flush Done Recieved From Driver\n"); 2424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (async_message_process(this,&vdpp_msg) < 0) { 2425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" VDPP Output Flush Done returns < 0 \n"); 2426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // dq input 2430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(input_flush_progress) 2431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.msgcode=VDPP_MSG_RESP_FLUSH_INPUT_DONE; 2433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg.status_code=VDPP_S_SUCCESS; 2434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Simulate VDPP Input Flush Done Recieved From Driver \n"); 2435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (async_message_process(this,&vdpp_msg) < 0) { 2436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" VDPP Input Flush Done returns < 0 \n"); 2437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else 2443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // flush input port 2444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(input_flush_progress) 2445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 2447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ioctl(drv_ctx.video_vpu_fd, VPU_FLUSH_BUFS, &buf_type)) 2449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("VDPP input Flush error! \n"); 2451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return false; 2452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("VDPP input Flush success! \n"); 2456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // flush output port 2460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(output_flush_progress) 2461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 2463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ioctl(drv_ctx.video_vpu_fd, VPU_FLUSH_BUFS, &buf_type)) 2465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("VDPP output Flush error! \n"); 2467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return false; 2468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("VDPP output Flush success! \n"); 2472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 2475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return bRet; 2477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/*========================================================================= 2479e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION : execute_output_flush 2480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2481e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 2482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Executes the OMX flush at OUTPUT PORT. 2483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2484e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 2485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 2486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2487e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 2488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 2489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin==========================================================================*/ 2490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::execute_output_flush() 2491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p1 = 0; // Parameter - 1 2493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p2 = 0; // Parameter - 2 2494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned ident = 0; 2495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool bRet = true; 2496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Generate FBD for all Buffers in the FTBq*/ 2498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_lock(&m_lock); 2499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Initiate Output Flush, m_ftb_q.m_size = %d", m_ftb_q.m_size); 2500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (m_ftb_q.m_size) 2501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Buffer queue size %d pending buf cnt %d", 2503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ftb_q.m_size,pending_output_buffers); 2504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ftb_q.pop_entry(&p1,&p2,&ident); 2505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" ID(%x) P1(%x) P2(%x)", ident, p1, p2); 2506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ident == m_fill_output_msg ) 2507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 2509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (ident == OMX_COMPONENT_GENERATE_FBD) 2511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 2513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_unlock(&m_lock); 2516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_flush_progress = false; 2517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" OMX flush o/p Port complete PenBuf(%d), output_qbuf_count(%d), output_dqbuf_count(%d)", 2519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_output_buffers, output_qbuf_count, output_dqbuf_count); 2520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return bRet; 2521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/*========================================================================= 2523e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION : execute_input_flush 2524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2525e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 2526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Executes the OMX flush at INPUT PORT. 2527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2528e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 2529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 2530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2531e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 2532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 2533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin==========================================================================*/ 2534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::execute_input_flush() 2535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i =0; 2537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p1 = 0; // Parameter - 1 2538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p2 = 0; // Parameter - 2 2539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned ident = 0; 2540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool bRet = true; 2541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Generate EBD for all Buffers in the ETBq*/ 2543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Initiate Input Flush \n"); 2544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_lock(&m_lock); 2546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Check if the Queue is empty \n"); 2547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (m_etb_q.m_size) 2548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" m_etb_q.m_size = %d \n", m_etb_q.m_size); 2550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_etb_q.pop_entry(&p1,&p2,&ident); 2551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("ident = %d \n", ident); 2552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) 2553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2); 2555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2); 2556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(ident == OMX_COMPONENT_GENERATE_ETB) 2558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_input_buffers++; 2560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d", 2561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers); 2562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 2563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (ident == OMX_COMPONENT_GENERATE_EBD) 2565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Flush Input OMX_COMPONENT_GENERATE_EBD %p", 2567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_BUFFERHEADERTYPE *)p1); 2568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 2569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_unlock(&m_lock); 2573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_flush_progress = false; 2574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prev_ts = LLONG_MAX; 2576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rst_prev_ts = true; 2577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _ANDROID_ 2579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_debug_timestamp) 2580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_timestamp_list.reset_ts_list(); 2582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 2584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" OMX flush i/p Port complete PenBuf(%d), input_qbuf_count(%d), input_dqbuf_count(%d)", 2586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_input_buffers, input_qbuf_count, input_dqbuf_count); 2587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return bRet; 2588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 2592e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 2593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::SendCommandEvent 2594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2595e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 2596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Send the event to VDPP pipe. This is needed to generate the callbacks 2597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin in VDPP thread context. 2598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2599e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 2600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 2601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2602e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 2603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 2604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 2606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::post_event(unsigned int p1, 2607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int p2, 2608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int id) 2609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool bRet = false; 2611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_lock(&m_lock); 2613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("m_fill_output_msg = %d, OMX_COMPONENT_GENERATE_FBD = %d, id = %d", m_fill_output_msg, OMX_COMPONENT_GENERATE_FBD, id); 2614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (id == m_fill_output_msg || 2615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin id == OMX_COMPONENT_GENERATE_FBD) 2616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW(" post_event p2 = 0x%x, id = 0x%x", p2, id); 2618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ftb_q.insert_entry(p1,p2,id); 2619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (id == OMX_COMPONENT_GENERATE_ETB || 2621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin id == OMX_COMPONENT_GENERATE_EBD || 2622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) 2623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_etb_q.insert_entry(p1,p2,id); 2625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cmd_q.insert_entry(p1,p2,id); 2629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bRet = true; 2632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW(" Value of this pointer in post_event %p, id = %d",this, id); 2633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_message(this, id); 2634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_unlock(&m_lock); 2636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return bRet; 2638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 2641e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 2642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::GetParameter 2643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2644e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 2645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Get Parameter method implementation 2646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2647e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 2648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 2649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2650e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 2651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Error None if successful. 2652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 2654e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::get_parameter(OMX_IN OMX_HANDLETYPE hComp, 2655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_INDEXTYPE paramIndex, 2656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INOUT OMX_PTR paramData) 2657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 2659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("get_parameter: \n"); 2661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StateInvalid) 2662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Get Param in Invalid State\n"); 2664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInvalidState; 2665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(paramData == NULL) 2667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n"); 2669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 2670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_HIGH("get_parameter 1 : \n"); 2672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch((unsigned long)paramIndex) 2673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamPortDefinition: 2675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_PORTDEFINITIONTYPE *portDefn = 2677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 2678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n"); 2679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = update_portdef(portDefn); 2680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (eRet == OMX_ErrorNone) 2681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_def = *portDefn; 2682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoInit: 2685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PORT_PARAM_TYPE *portParamType = 2687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PORT_PARAM_TYPE *) paramData; 2688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n"); 2689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portParamType->nVersion.nVersion = OMX_SPEC_VERSION; 2691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portParamType->nSize = sizeof(portParamType); 2692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portParamType->nPorts = 2; 2693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portParamType->nStartPortNumber = 0; 2694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoPortFormat: 2697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 2699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 2700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n"); 2701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portFmt->nVersion.nVersion = OMX_SPEC_VERSION; 2703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portFmt->nSize = sizeof(portFmt); 2704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (OMX_CORE_INPUT_PORT_INDEX == portFmt->nPortIndex) 2706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (0 == portFmt->nIndex) 2708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;//OMX_COLOR_FormatYUV420Planar;//OMX_COLOR_FormatUnused; 2710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 2711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\ 2715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " NoMore compression formats\n"); 2716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorNoMore; 2717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (OMX_CORE_OUTPUT_PORT_INDEX == portFmt->nPortIndex) 2720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portFmt->eCompressionFormat = OMX_VIDEO_CodingUnused; 2722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(0 == portFmt->nIndex) 2724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE) 2725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 2726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\ 2729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " NoMore Color formats\n"); 2730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorNoMore; 2731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("returning %d\n", portFmt->eColorFormat); 2733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n", 2737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (int)portFmt->nPortIndex); 2738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadPortIndex; 2739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Component should support this port definition*/ 2743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamAudioInit: 2744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PORT_PARAM_TYPE *audioPortParamType = 2746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PORT_PARAM_TYPE *) paramData; 2747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n"); 2748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 2749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin audioPortParamType->nSize = sizeof(audioPortParamType); 2750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin audioPortParamType->nPorts = 0; 2751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin audioPortParamType->nStartPortNumber = 0; 2752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Component should support this port definition*/ 2755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamImageInit: 2756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PORT_PARAM_TYPE *imagePortParamType = 2758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PORT_PARAM_TYPE *) paramData; 2759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n"); 2760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION; 2761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin imagePortParamType->nSize = sizeof(imagePortParamType); 2762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin imagePortParamType->nPorts = 0; 2763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin imagePortParamType->nStartPortNumber = 0; 2764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Component should support this port definition*/ 2768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamOtherInit: 2769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n", 2771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin paramIndex); 2772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet =OMX_ErrorUnsupportedIndex; 2773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamStandardComponentRole: 2776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_COMPONENTROLETYPE *comp_role; 2778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 2779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin comp_role->nVersion.nVersion = OMX_SPEC_VERSION; 2780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin comp_role->nSize = sizeof(*comp_role); 2781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n", 2783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin paramIndex); 2784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char*)comp_role->cRole,(const char*)m_cRole, 2785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE); 2786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Added for parameter test */ 2789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamPriorityMgmt: 2790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PRIORITYMGMTTYPE *priorityMgmType = 2793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PRIORITYMGMTTYPE *) paramData; 2794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n"); 2795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION; 2796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin priorityMgmType->nSize = sizeof(priorityMgmType); 2797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Added for parameter test */ 2801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamCompBufferSupplier: 2802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = 2804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 2805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n"); 2806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufferSupplierType->nSize = sizeof(bufferSupplierType); 2808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION; 2809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(OMX_CORE_INPUT_PORT_INDEX == bufferSupplierType->nPortIndex) 2810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 2811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (OMX_CORE_OUTPUT_PORT_INDEX == bufferSupplierType->nPortIndex) 2812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified; 2813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadPortIndex; 2815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 2820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: 2821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage"); 2823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData; 2824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if((nativeBuffersUsage->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) || (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX)) 2825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 2827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined (MAX_RES_720P) 2828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_CAMERA_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 2829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("ION:720P: nUsage 0x%x",nativeBuffersUsage->nUsage); 2830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else 2831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_MM_HEAP; 2833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("ION:non_secure_mode: nUsage 0x%lx",nativeBuffersUsage->nUsage); 2834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif //(MAX_RES_720P) 2836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else // USE_ION 2837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined (MAX_RES_720P) || defined (MAX_RES_1080P_EBI) 2838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 2839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("720P/1080P_EBI: nUsage 0x%x",nativeBuffersUsage->nUsage); 2840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#elif MAX_RES_1080P 2841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_SMI_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED); 2842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("1080P: nUsage 0x%x",nativeBuffersUsage->nUsage); 2843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 2844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif // USE_ION 2845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 2846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!"); 2847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 2848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 2852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 2854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex); 2856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet =OMX_ErrorUnsupportedIndex; 2857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" get_parameter returning input WxH(%d x %d) SxSH(%d x %d)\n", 2862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.frame_width, 2863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.frame_height, 2864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.stride, 2865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.scan_lines); 2866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" get_parameter returning output WxH(%d x %d) SxSH(%d x %d)\n", 2868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_width, 2869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_height, 2870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.stride, 2871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.scan_lines); 2872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 2874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 2877e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data) 2878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Inside use_android_native_buffer"); 2880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 2881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data; 2882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if((params == NULL) || 2884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (params->nativeBuffer == NULL) || 2885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (params->nativeBuffer->handle == NULL) || 2886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !m_enable_android_native_buffers) 2887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 2888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_use_android_native_buffers = OMX_TRUE; 2889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sp<android_native_buffer_t> nBuf = params->nativeBuffer; 2890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin private_handle_t *handle = (private_handle_t *)nBuf->handle; 2891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port 2892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U8 *buffer = NULL; 2893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer = (OMX_U8*)mmap(0, handle->size, 2895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 2896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(buffer == MAP_FAILED) { 2897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 2898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 2899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer); 2901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 2902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 2903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 2905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 2907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 2908e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 2909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::Setparameter 2910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2911e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 2912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Set Parameter method implementation. 2913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2914e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 2915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 2916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2917e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 2918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None if successful. 2919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 2921e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::set_parameter(OMX_IN OMX_HANDLETYPE hComp, 2922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_INDEXTYPE paramIndex, 2923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR paramData) 2924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 2926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int ret=0; 2927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int i = 0; 2928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_format fmt; 2929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StateInvalid) 2931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Set Param in Invalid State\n"); 2933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInvalidState; 2934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(paramData == NULL) 2936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n"); 2938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 2939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if((m_state != OMX_StateLoaded) && 2941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) && 2942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_out_bEnabled == OMX_TRUE) && 2943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) && 2944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_inp_bEnabled == OMX_TRUE)) { 2945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Set Param in Invalid State \n"); 2946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorIncorrectStateOperation; 2947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch((unsigned long)paramIndex) 2949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamPortDefinition: 2951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 2953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 2954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n", 2956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (int)portDefn->format.video.nFrameHeight, 2957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (int)portDefn->format.video.nFrameWidth); 2958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(OMX_CORE_OUTPUT_PORT_INDEX == portDefn->nPortIndex) 2960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n"); 2962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int buffer_size; 2964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&fmt, 0, sizeof(fmt)); 2965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // set output resolution based on port definition. scan_lines and stride settings need 2967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // to match format setting requirement (QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) 2968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" SetParam OP: WxH(%lu x %lu)\n", 2970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameWidth, 2971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameHeight); 2972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (portDefn->format.video.nFrameHeight != 0x0 && 2973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameWidth != 0x0) 2974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_height = portDefn->format.video.nFrameHeight; 2976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_width = portDefn->format.video.nFrameWidth; 2977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.scan_lines = paddedFrameWidth32(portDefn->format.video.nFrameHeight); 2978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.stride = paddedFrameWidth128(portDefn->format.video.nFrameWidth); 2979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 2981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height = drv_ctx.video_resolution_output.frame_height; 2982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width = drv_ctx.video_resolution_output.frame_width; 2983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 2984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = capture_capability; 2985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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, 2986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height, drv_ctx.video_resolution_output.stride, drv_ctx.video_resolution_output.scan_lines); 2987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // NV12 has 2 planes. 2988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Set format for each plane. */ 2989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin setFormatParams(capture_capability, drv_ctx.output_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 2990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 2991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.output_bytesperpixel[i] * fmt.fmt.pix_mp.height); 2993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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 2994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 2995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 2999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 3000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 3001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 3003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret) 3006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Set Resolution failed"); 3008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 3009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = get_buffer_req(&drv_ctx.op_buf); 3014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // eRet = get_buffer_req(&drv_ctx.ip_buf); 3016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount /*|| 3021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->nBufferSize >= drv_ctx.op_buf.buffer_size*/ ) 3022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual; 3024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //drv_ctx.op_buf.buffer_size = portDefn->nBufferSize; 3025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = set_buffer_req(&drv_ctx.op_buf); 3026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (eRet == OMX_ErrorNone) 3027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_def = *portDefn; 3028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)\n", 3032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size, 3033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->nBufferCountActual, portDefn->nBufferSize); 3034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 3035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(OMX_CORE_INPUT_PORT_INDEX == portDefn->nPortIndex) 3038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // TODO for 8092 the frame rate code below can be enabled to debug frame rate 3040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef FRC_ENABLE 3041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if((portDefn->format.video.xFramerate >> 16) > 0 && 3042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) 3043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Frame rate only should be set if this is a "known value" or to 3045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // activate ts prediction logic (arbitrary mode only) sending input 3046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // timestamps with max value (LLONG_MAX). 3047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu", 3048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.xFramerate >> 16); 3049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator, 3050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_denominator); 3051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!drv_ctx.frame_rate.fps_numerator) 3052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 3054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_numerator = 30; 3055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.frame_rate.fps_denominator) 3057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_numerator = (int) 3058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 3059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_denominator = 1; 3060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 3061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_numerator; 3062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("set_parameter: frm_int(%lu) fps(%.2f)", 3063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin frm_int, drv_ctx.frame_rate.fps_numerator / 3064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (float)drv_ctx.frame_rate.fps_denominator); 3065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_outputparm oparm; 3067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*XXX: we're providing timing info as seconds per frame rather than frames 3068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * per second.*/ 3069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 3070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 3071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_streamparm sparm; 3073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&sparm, 0, sizeof(struct v4l2_streamparm)); 3074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 3075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sparm.parm.output = oparm; 3076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_PARM, &sparm)) { 3077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \ 3078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin performance might be affected"); 3079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorHardware; 3080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&fmt, 0, sizeof(fmt)); 3084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n"); 3085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.video_resolution_input.frame_height != 3086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameHeight || 3087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.frame_width != 3088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameWidth) 3089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" SetParam IP: WxH(%lu x %lu)\n", 3091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameWidth, 3092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameHeight); 3093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (portDefn->format.video.nFrameHeight != 0x0 && 3094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameWidth != 0x0) 3095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin update_resolution(portDefn->format.video.nFrameWidth, 3097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (portDefn->format.video.nFrameHeight), 3098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nStride, 3099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (portDefn->format.video.nSliceHeight)); 3100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // decoder stride information is not used in S_FMT and QBUF, since paddedWidth 3102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // will ensure the buffer length/size is always aligned with 128 bytes, which 3103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // has the same effect as stride. 3104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // output has Width 720, and nStride = 768 3105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 3106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height = drv_ctx.video_resolution_input.frame_height; 3107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width = drv_ctx.video_resolution_input.frame_width; 3108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (V4L2_FIELD_NONE == drv_ctx.interlace) 3109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 3111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_INTERLACED; 3115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = output_capability; 3117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // NV12 has 2 planes. 3119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Set format for each plane. */ 3120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin setFormatParams(output_capability, drv_ctx.input_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 3121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 3122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.input_bytesperpixel[i] * fmt.fmt.pix_mp.height); 3124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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 3125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 3126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 3129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 3130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 3131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // { 3132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //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); 3133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // } 3134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret) 3135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Set Resolution failed"); 3137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 3138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("after VIDIOC_S_FMT (ip) drv_ctx.interlace = %d", drv_ctx.interlace); 3143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // set output resolution the same as input 3144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_height = portDefn->format.video.nFrameHeight; 3145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_width = portDefn->format.video.nFrameWidth; 3146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.scan_lines = paddedFrameWidth32(portDefn->format.video.nSliceHeight); 3147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.stride = paddedFrameWidth128(portDefn->format.video.nStride); 3148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 3150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height = drv_ctx.video_resolution_output.frame_height; 3151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width = drv_ctx.video_resolution_output.frame_width; 3152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 3153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = capture_capability; 3154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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, 3155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height, drv_ctx.video_resolution_output.stride, drv_ctx.video_resolution_output.scan_lines); 3156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // NV12 has 2 planes. 3157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Set format for each plane. */ 3158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin setFormatParams(capture_capability, drv_ctx.output_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 3159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 3160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.output_bytesperpixel[i] * fmt.fmt.pix_mp.height); 3162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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 3163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 3164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin #ifndef STUB_VPU 3167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 3168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 3169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 3171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret) 3174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Set Resolution failed"); 3176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 3177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin #endif 3180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // get buffer req for input, output buffer size is 3182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // determined by output pixel format and output resolution 3183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //eRet = get_buffer_req(&drv_ctx.op_buf); 3184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = get_buffer_req(&drv_ctx.ip_buf); 3185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount 3191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*|| portDefn->nBufferSize >= drv_ctx.ip_buf.buffer_size*/) 3192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // only allocate larger size 3193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 3195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_allocatorproperty *buffer_prop = &drv_ctx.ip_buf; 3196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual; 3197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //if(portDefn->nBufferSize >= drv_ctx.ip_buf.buffer_size) 3198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //{ 3199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) & 3200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // (~(buffer_prop->alignment - 1)); 3201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // DEBUG_PRINT_HIGH("drv_ctx.ip_buf.buffer_size = %d, buffer_prop->alignment = %d\n", drv_ctx.ip_buf.buffer_size, buffer_prop->alignment); 3202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //} 3203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = set_buffer_req(buffer_prop); 3204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)\n", 3208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size, 3209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->nBufferCountActual, portDefn->nBufferSize); 3210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 3211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (portDefn->eDir == OMX_DirMax) 3214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d", 3216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (int)portDefn->nPortIndex); 3217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadPortIndex; 3218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoPortFormat: 3222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 3224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 3225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int ret=0; 3226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_format fmt; 3227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n", 3228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portFmt->eColorFormat); 3229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(OMX_CORE_OUTPUT_PORT_INDEX == portFmt->nPortIndex) 3231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin uint32_t op_format; 3233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&fmt, 0, sizeof(fmt)); 3235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 3236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height = drv_ctx.video_resolution_output.frame_height; 3237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width = drv_ctx.video_resolution_output.frame_width; 3238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 3239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // TODO based on output format 3241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // update OMX format type for additional output format supported by 8084 3242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) 3243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) || 3244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar)) 3245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin op_format = (uint32_t)V4L2_PIX_FMT_NV12; 3246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(portFmt->eColorFormat == 3247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_COLOR_FORMATTYPE) 3248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_COLOR_FormatYVU420SemiPlanar) 3249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin op_format = V4L2_PIX_FMT_NV21; 3250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 3252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eRet == OMX_ErrorNone) 3254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_format = op_format; 3256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin capture_capability = op_format; 3257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = capture_capability; 3258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VP output frame width = %d, height = %d", fmt.fmt.pix_mp.width, 3260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height); 3261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin setFormatParams(capture_capability, drv_ctx.output_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 3263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 3264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * 3266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_bytesperpixel[i] * 3267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height); 3268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[i].bytesperline = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.output_bytesperpixel[0]); 3269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 3271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 3272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ret) 3273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Set output format failed"); 3275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 3276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = get_buffer_req(&drv_ctx.op_buf); 3281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamStandardComponentRole: 3288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_COMPONENTROLETYPE *comp_role; 3290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 3291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n", 3292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin comp_role->cRole); 3293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if((m_state == OMX_StateLoaded)&& 3295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 3296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Set Parameter called in valid state"); 3298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n"); 3302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorIncorrectStateOperation; 3303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // no component role yet 3306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* if(!strncmp(drv_ctx.kind, "OMX.qcom.video.vidpp",OMX_MAX_STRINGNAME_SIZE)) 3307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!strncmp((char*)comp_role->cRole,"video.vidpp",OMX_MAX_STRINGNAME_SIZE)) 3309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char*)m_cRole,"video.vidpp",OMX_MAX_STRINGNAME_SIZE); 3311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole); 3315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet =OMX_ErrorUnsupportedSetting; 3316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind); 3321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInvalidComponentName; 3322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } */ 3323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamPriorityMgmt: 3327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state != OMX_StateLoaded) 3329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n"); 3331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorIncorrectStateOperation; 3332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData; 3334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %lu\n", 3335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin priorityMgmtype->nGroupID); 3336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %lu\n", 3338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin priorityMgmtype->nGroupPriority); 3339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_priority_mgm.nGroupID = priorityMgmtype->nGroupID; 3341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority; 3342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamCompBufferSupplier: 3347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 3349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n", 3350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufferSupplierType->eBufferSupplier); 3351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1) 3352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier; 3353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadPortIndex; 3357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 3362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Need to allow following two set_parameters even in Idle 3363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * state. This is ANDROID architecture which is not in sync 3364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * with openmax standard. */ 3365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: 3366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData; 3368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(enableNativeBuffers) { 3369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_enable_android_native_buffers = enableNativeBuffers->enable; 3370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: enableNativeBuffers %d\n", m_enable_android_native_buffers); 3372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: 3375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = use_android_native_buffer(hComp, paramData); 3377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexParamInterlaceExtraData: 3381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, 3382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((QOMX_ENABLETYPE *)paramData)->bEnable); 3383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamInterlaceFormat: 3386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INTERLACEFORMATTYPE *interlaceFormat = ( OMX_INTERLACEFORMATTYPE *)paramData; 3388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamInterlaceFormat %ld\n", 3389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin interlaceFormat->nFormat); 3390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(OMX_InterlaceInterleaveFrameBottomFieldFirst == (OMX_U32)interlaceFormat->nFormat) 3392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.interlace = V4L2_FIELD_INTERLACED_BT; 3394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: V4L2_FIELD_INTERLACED_BT"); 3395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin interlace_user_flag = true; 3396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(OMX_InterlaceInterleaveFrameTopFieldFirst == (OMX_U32)interlaceFormat->nFormat) 3398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.interlace = V4L2_FIELD_INTERLACED_TB; 3400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: V4L2_FIELD_INTERLACED_TB"); 3401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin interlace_user_flag = true; 3402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(OMX_InterlaceFrameProgressive == (OMX_U32)interlaceFormat->nFormat) 3404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.interlace = V4L2_FIELD_NONE; 3406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_parameter: V4L2_FIELD_NONE"); 3407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin interlace_user_flag = true; 3408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Setparameter: unknown param %lu\n", interlaceFormat->nFormat); 3412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 3413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 3417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex); 3419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedIndex; 3420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 3423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 3426e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 3427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::GetConfig 3428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3429e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 3430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Get Config Method implementation. 3431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3432e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 3433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 3434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3435e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 3436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None if successful. 3437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 3439e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::get_config(OMX_IN OMX_HANDLETYPE hComp, 3440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_INDEXTYPE configIndex, 3441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INOUT OMX_PTR configData) 3442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 3444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 3446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Get Config in Invalid State\n"); 3448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInvalidState; 3449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch ((unsigned long)configIndex) 3452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexConfigCommonOutputCrop: 3454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData; 3456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE)); 3457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // OMX extensions 3461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexConfigActiveRegionDetectionStatus: 3462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 3465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex); 3467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 3468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 3473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 3476e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 3477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::SetConfig 3478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3479e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 3480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Set Config method implementation 3481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3482e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 3483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 3484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3485e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 3486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None if successful. 3487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 3488e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::set_config(OMX_IN OMX_HANDLETYPE hComp, 3489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_INDEXTYPE configIndex, 3490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR configData) 3491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 3493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vpu_control control; 3494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int result = 0; 3495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::set_config \n"); 3497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StateInvalid) 3498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Get Config in Invalid State\n"); 3500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInvalidState; 3501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch ((unsigned long)configIndex) 3504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // OMX extensions 3506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexConfigActiveRegionDetection: 3507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vpu_ctrl_active_region_param *ard = &control.data.active_region_param; 3509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&control, 0, sizeof(control)); 3510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.control_id = VPU_CTRL_ACTIVE_REGION_PARAM; 3511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mExtensionData.activeRegionDetectionDirtyFlag = true; 3512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(&(mExtensionData.activeRegionDetection), 3513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin configData, 3514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(mExtensionData.activeRegionDetection)); 3515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Set control. */ 3517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ard->enable = mExtensionData.activeRegionDetection.bEnable; 3518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ard->num_exclusions = mExtensionData.activeRegionDetection.nNumExclusionRegions; 3519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(&(ard->detection_region), &(mExtensionData.activeRegionDetection.sROI), sizeof(QOMX_RECTTYPE)); 3520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ard->num_exclusions > 0) 3521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(&(ard->detection_region), &(mExtensionData.activeRegionDetection.sExclusionRegions), (ard->num_exclusions * sizeof(QOMX_RECTTYPE))); 3523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_ACTIVE_REGION_MEASURE : " 3526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "top %d left %d width %d height %d", 3527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ard->detection_region.top, ard->detection_region.left, 3528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ard->detection_region.width, ard->detection_region.height); 3529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 3530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin result = ioctl(drv_ctx.video_vpu_fd, VPU_S_CONTROL, &control); 3531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (result < 0) 3532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("VIDIOC_S_CTRL VPU_S_CTRL_ACTIVE_REGION_MEASURE failed, result = %d", result); 3534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 3535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mExtensionData.activeRegionDetectionDirtyFlag = false; 3539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_ACTIVE_REGION_MEASURE set to: " 3540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "top %d left %d width %d height %d", 3541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ard->detection_region.top, ard->detection_region.left, 3542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ard->detection_region.width, ard->detection_region.height); 3543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexConfigScalingMode: 3549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vpu_ctrl_standard *anmph = &control.data.standard; 3551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&control, 0, sizeof(control)); 3552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.control_id = VPU_CTRL_ANAMORPHIC_SCALING; 3553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mExtensionData.scalingModeDirtyFlag = true; 3554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(&(mExtensionData.scalingMode), 3555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin configData, 3556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(mExtensionData.scalingMode)); 3557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Set control. */ 3559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin anmph->enable = 1; 3560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin anmph->value = mExtensionData.scalingMode.eScaleMode; 3561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_ANAMORPHIC_SCALING %d, anmph->enable = %d", anmph->value, anmph->enable); 3563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 3564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin result = ioctl(drv_ctx.video_vpu_fd, VPU_S_CONTROL, &control); 3565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (result < 0) 3566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("VIDIOC_S_CTRL VPU_S_CTRL_ANAMORPHIC_SCALING failed, result = %d", result); 3568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 3569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mExtensionData.scalingModeDirtyFlag = false; 3573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_ANAMORPHIC_SCALING set to %d", anmph->value); 3574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexConfigNoiseReduction: 3580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vpu_ctrl_auto_manual *nr = &control.data.auto_manual; 3582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&control, 0, sizeof(control)); 3583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.control_id = VPU_CTRL_NOISE_REDUCTION; 3584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mExtensionData.noiseReductionDirtyFlag = true; 3585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(&(mExtensionData.noiseReduction), 3586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin configData, 3587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(mExtensionData.noiseReduction)); 3588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Set control. */ 3590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nr->enable = mExtensionData.noiseReduction.bEnable; 3591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nr->auto_mode = mExtensionData.noiseReduction.bAutoMode; 3592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nr->value = mExtensionData.noiseReduction.nNoiseReduction; 3593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 3595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 3596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin result = ioctl(drv_ctx.video_vpu_fd, VPU_S_CONTROL, &control); 3597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (result < 0) 3598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("VIDIOC_S_CTRL VPU_S_CTRL_NOISE_REDUCTION failed, result = %d", result); 3600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 3601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mExtensionData.noiseReductionDirtyFlag = false; 3605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_NOISE_REDUCTION set to %d", nr->value); 3606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexConfigImageEnhancement: 3612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vpu_ctrl_auto_manual *ie = &control.data.auto_manual; 3614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&control, 0, sizeof(control)); 3615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin control.control_id = VPU_CTRL_IMAGE_ENHANCEMENT; 3616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mExtensionData.imageEnhancementDirtyFlag = true; 3617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(&(mExtensionData.imageEnhancement), 3618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin configData, 3619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(mExtensionData.imageEnhancement)); 3620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Set control. */ 3622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ie->enable = mExtensionData.imageEnhancement.bEnable; 3623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ie->auto_mode = mExtensionData.imageEnhancement.bAutoMode; 3624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ie->value = mExtensionData.imageEnhancement.nImageEnhancement; 3625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 3627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 3628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin result = ioctl(drv_ctx.video_vpu_fd, VPU_S_CONTROL, &control); 3629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (result < 0) 3630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("VIDIOC_S_CTRL VPU_S_CTRL_IMAGE_ENHANCEMENT failed, result = %d", result); 3632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 3633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin mExtensionData.imageEnhancementDirtyFlag = false; 3637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("VIDIOC_S_CTRL: VPU_S_CTRL_IMAGE_ENHANCEMENT set to %d", ie->value); 3638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef FRC_ENABLE 3643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexVendorVideoFrameRate: 3644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData; 3647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("OMX_IndexVendorVideoFrameRate %d", config->nFps); 3648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) { 3650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (config->bEnabled) { 3651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((config->nFps >> 16) > 0) { 3652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %d", 3653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin config->nFps >> 16); 3654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator, 3655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_denominator); 3656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!drv_ctx.frame_rate.fps_numerator) { 3658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Numerator is zero setting to 30"); 3659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_numerator = 30; 3660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.frame_rate.fps_denominator) { 3663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_numerator = (int) 3664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; 3665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_denominator = 1; 3668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / 3669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_numerator; 3670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_outputparm oparm; 3672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*XXX: we're providing timing info as seconds per frame rather than frames 3673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * per second.*/ 3674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 3675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 3676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_streamparm sparm; 3678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&sparm, 0, sizeof(struct v4l2_streamparm)); 3679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 3680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sparm.parm.output = oparm; 3681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 3682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_PARM, &sparm)) { 3683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \ 3684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin performance might be affected"); 3685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorHardware; 3686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_set_fps = true; 3689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 3690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Frame rate not supported."); 3691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorUnsupportedSetting; 3692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 3694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate"); 3695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_set_fps = false; 3696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { // 8084 doesn't support FRC (only 8092 does). only input framerate setting is supported. 3698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d", 3699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (int)config->nPortIndex); 3700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadPortIndex; 3701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexConfigCallbackRequest: 3707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CONFIG_CALLBACKREQUESTTYPE *callbackRequest = (OMX_CONFIG_CALLBACKREQUESTTYPE *) configData; 3709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("OMX_IndexConfigCallbackRequest %d", callbackRequest->bEnable); 3710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (callbackRequest->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) { 3712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((callbackRequest->bEnable) && (OMX_QcomIndexConfigActiveRegionDetectionStatus == (OMX_QCOM_EXTN_INDEXTYPE)callbackRequest->nIndex)) 3713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ar_callback_setup = true; 3715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexConfigCommonOutputCrop: 3720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData; 3722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(&rectangle, rect, sizeof(OMX_CONFIG_RECTTYPE)); 3723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 3726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("set_config: unknown param 0x%08x\n",configIndex); 3728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 3729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 3733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 3736e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 3737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::GetExtensionIndex 3738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3739e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 3740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX GetExtensionIndex method implementaion. <TBD> 3741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3742e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 3743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 3744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3745e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 3746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None if everything successful. 3747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 3749e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::get_extension_index(OMX_IN OMX_HANDLETYPE hComp, 3750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_STRING paramName, 3751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_OUT OMX_INDEXTYPE* indexType) 3752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::get_extension_index %s\n", paramName); 3754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StateInvalid) 3755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n"); 3757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInvalidState; 3758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 3760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) { 3761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 3762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("OMX.google.android.index.enableAndroidNativeBuffers"); 3763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) { 3765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 3766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("OMX.google.android.index.useAndroidNativeBuffer2"); 3767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) { 3769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName); 3770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 3771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("OMX.google.android.index.useAndroidNativeBuffer"); 3772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) { 3774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 3775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("OMX.google.android.index.getAndroidNativeBufferUsage"); 3776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* VIDPP extension 3780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(!strncmp(paramName, 3782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_INDEX_CONFIG_ACTIVE_REGION_DETECTION_STATUS, 3783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(OMX_QCOM_INDEX_CONFIG_ACTIVE_REGION_DETECTION_STATUS) - 1)) 3784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_extension_index OMX_QCOM_INDEX_CONFIG_ACTIVE_REGION_DETECTION_STATUS 0x%x \n", OMX_QcomIndexConfigActiveRegionDetectionStatus); 3786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigActiveRegionDetectionStatus; 3787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(!strncmp(paramName, 3789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_INDEX_CONFIG_ACTIVE_REGION_DETECTION, 3790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(OMX_QCOM_INDEX_CONFIG_ACTIVE_REGION_DETECTION) - 1)) 3791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_extension_index OMX_QCOM_INDEX_CONFIG_ACTIVE_REGION_DETECTION 0x%x \n", OMX_QcomIndexConfigActiveRegionDetection); 3793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigActiveRegionDetection; 3794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(!strncmp(paramName, 3796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_INDEX_CONFIG_SCALING_MODE, 3797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(OMX_QCOM_INDEX_CONFIG_SCALING_MODE) - 1)) 3798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_extension_index OMX_QCOM_INDEX_CONFIG_SCALING_MODE 0x%x \n", OMX_QcomIndexConfigScalingMode); 3800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigScalingMode; 3801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(!strncmp(paramName, 3803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_INDEX_CONFIG_NOISEREDUCTION, 3804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(OMX_QCOM_INDEX_CONFIG_NOISEREDUCTION) - 1)) 3805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_extension_index OMX_QCOM_INDEX_CONFIG_NOISEREDUCTION 0x%x \n", OMX_QcomIndexConfigNoiseReduction); 3807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigNoiseReduction; 3808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(!strncmp(paramName, 3810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_INDEX_CONFIG_IMAGEENHANCEMENT, 3811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(OMX_QCOM_INDEX_CONFIG_IMAGEENHANCEMENT) - 1)) 3812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_extension_index OMX_QCOM_INDEX_CONFIG_IMAGEENHANCEMENT 0x%x \n", OMX_QcomIndexConfigImageEnhancement); 3814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigImageEnhancement; 3815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else { 3818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName); 3819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNotImplemented; 3820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 3822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 3825e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 3826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::GetState 3827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3828e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 3829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Returns the state information back to the caller.<TBD> 3830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3831e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 3832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 3833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3834e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 3835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Error None if everything is successful. 3836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 3837e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::get_state(OMX_IN OMX_HANDLETYPE hComp, 3838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_OUT OMX_STATETYPE* state) 3839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *state = m_state; 3841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state); 3842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 3843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 3846e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 3847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::ComponentTunnelRequest 3848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3849e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 3850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Component Tunnel Request method implementation. <TBD> 3851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3852e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 3853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 3854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3855e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 3856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None if everything successful. 3857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 3859e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp, 3860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 port, 3861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_HANDLETYPE peerComponent, 3862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 peerPort, 3863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup) 3864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n"); 3866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNotImplemented; 3867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3869e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::use_output_buffer( 3870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_HANDLETYPE hComp, 3871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 3872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 port, 3873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR appData, 3874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 bytes, 3875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U8* buffer) 3876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 3878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 3879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i= 0; // Temporary counter 3880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_setbuffer_cmd setbuffers; 3881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR privateAppData = NULL; 3882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin private_handle_t *handle = NULL; 3883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U8 *buff = buffer; 3884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_buffer buf; 3885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_plane plane[VIDEO_MAX_PLANES]; 3886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int extra_idx = 0; 3887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Inside omx_vdpp::use_output_buffer buffer = %p, bytes= %lu", buffer, bytes); 3889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!m_out_mem_ptr) { 3891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers buffer = %p, bytes= %lu", buffer, bytes); 3892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = allocate_output_headers(); 3893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (eRet == OMX_ErrorNone) { 3896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(i=0; i< drv_ctx.op_buf.actualcount; i++) { 3897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_ABSENT(&m_out_bm_count,i)) 3898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(i >= drv_ctx.op_buf.actualcount) { 3905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Already using %d o/p buffers\n", drv_ctx.op_buf.actualcount); 3906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 3907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (eRet == OMX_ErrorNone) { 3910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 3911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_enable_android_native_buffers) { 3912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Use_op_buf:m_enable_android_native_buffers 1\n"); 3913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_use_android_native_buffers) { 3914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Use_op_buf:m_enable_android_native_buffers 2\n"); 3915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 3916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sp<android_native_buffer_t> nBuf = params->nativeBuffer; 3917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin handle = (private_handle_t *)nBuf->handle; 3918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin privateAppData = params->pAppPrivate; 3919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 3920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Use_op_buf:m_enable_android_native_buffers 3\n"); 3921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin handle = (private_handle_t *)buff; 3922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin privateAppData = appData; 3923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!handle) { 3926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 3927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 3928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) { 3931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 3932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " expected %u, got %lu", 3933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size); 3934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 3935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined(_ANDROID_ICS_) 3938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin native_buffer[i].nativehandle = handle; 3939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin native_buffer[i].privatehandle = handle; 3940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd; 3942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].offset = 0; 3943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].bufferaddr = NULL; 3944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 3945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size; 3946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Use_op_buf:m_enable_android_native_buffers 5 drv_ctx.ptr_outputbuffer[i].bufferaddr = %p, size1=%d, size2=%d\n", 3947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].bufferaddr, 3948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.buffer_size, 3949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin handle->size); 3950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else 3951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!ouput_egl_buffers && !m_use_output_pmem) { 3954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 3955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 3956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment, 3957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &drv_ctx.op_buf_ion_info[i].ion_alloc_data, 3958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &drv_ctx.op_buf_ion_info[i].fd_ion_data, 0); 3959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) { 3960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ION device fd is bad %d\n", drv_ctx.op_buf_ion_info[i].ion_device_fd); 3961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 3962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 3964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf_ion_info[i].fd_ion_data.fd; 3965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else 3966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].pmem_fd = \ 3967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin open (MEM_DEVICE,O_RDWR); 3968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) { 3970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd); 3971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 3972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd, 3975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.buffer_size, 3976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.alignment)) 3977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" align_pmem_buffers() failed"); 3979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 3980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 3981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].bufferaddr = 3985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size, 3986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin PROT_READ|PROT_WRITE, MAP_SHARED, 3987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].pmem_fd,0); 3988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) { 3989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(drv_ctx.ptr_outputbuffer[i].pmem_fd); 3990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 3991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 3992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 3993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Unable to mmap output buffer\n"); 3994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 3995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].offset = 0; 3998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin privateAppData = appData; 3999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else { 4001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem); 4003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!appData || !bytes ) { 4004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!buffer) { 4005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Bad parameters for use buffer in EGL image case"); 4006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 4007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list; 4011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info; 4012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData; 4013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!pmem_list || !pmem_list->entryList || !pmem_list->entryList->entry || 4014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin !pmem_list->nEntries || 4015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) { 4016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Pmem info not valid in use buffer"); 4017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 4018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *) 4020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_list->entryList->entry; 4021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx", 4022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_info->pmem_fd); 4023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd; 4024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset; 4025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].bufferaddr = buff; 4026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].mmaped_size = 4027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size; 4028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin privateAppData = appData; 4029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *bufferHdr = (m_out_mem_ptr + i ); 4032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i], 4034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof (vdpp_bufferpayload)); 4035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i, 4037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].bufferaddr, 4038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].pmem_fd ); 4039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 4040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("use_output_buffer: i = %d, streaming[CAPTURE_PORT] = %d ", i, streaming[CAPTURE_PORT]); 4041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // stream on output port 4042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) { 4043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin enum v4l2_buf_type buf_type; 4044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 4045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ioctl(drv_ctx.video_vpu_fd, VIDIOC_STREAMON,&buf_type)) { 4046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE STREAMON failed \n "); 4047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 4049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin streaming[CAPTURE_PORT] = true; 4050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE STREAMON Successful \n "); 4051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size; 4056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_enable_android_native_buffers) { 4057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle); 4058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*bufferHdr)->pBuffer = (OMX_U8 *)handle; 4059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 4060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*bufferHdr)->pBuffer = buff; 4061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*bufferHdr)->pAppPrivate = privateAppData; 4063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_out_bm_count,i); 4064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 4066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 4070e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 4071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::use_input_heap_buffers 4072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4073e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 4074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Use Buffer Heap allocation method implementation. 4075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4076e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 4077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 4078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4079e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 4080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None , if everything successful. 4081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 4083e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::use_input_heap_buffers( 4084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_HANDLETYPE hComp, 4085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 port, 4087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR appData, 4088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 bytes, 4089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U8* buffer) 4090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR privateAppData = NULL; 4092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 4093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin private_handle_t *handle = NULL; 4094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U8 *buff = buffer; 4096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer); 4098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 4099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!m_inp_heap_ptr) 4100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Inside %s 0, %p\n", __FUNCTION__, buffer); 4102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 4103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 4104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.actualcount); 4105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!m_phdr_pmem_ptr) 4108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Inside %s 0-1, %p\n", __FUNCTION__, buffer); 4110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 4111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 4112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.actualcount); 4113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!m_inp_heap_ptr || !m_phdr_pmem_ptr) 4115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Insufficent memory"); 4117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 4118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) 4120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 4122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_use_buffer = true; 4123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 4124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // update this buffer for native window buffer in etb 4125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // OMXNodeInstance::useGraphicBuffer2_l check if pBuffer and pAppPrivate are 4126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // the same value as passed in. If not, useGraphicBuffer2_l will exit on error 4127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // 4128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 4129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 4130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 4131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 4132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 4133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // save mmapped native window buffer address to pPlatformPrivate 4134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // use this mmaped buffer address in etb_proxy 4135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 4136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*if(m_enable_android_native_buffers) */{ 4137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_use_android_native_buffers) { 4138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 4139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sp<android_native_buffer_t> nBuf = params->nativeBuffer; 4140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin handle = (private_handle_t *)nBuf->handle; 4141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin privateAppData = params->pAppPrivate; 4142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 4143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin handle = (private_handle_t *)buff; 4144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin privateAppData = appData; 4145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::use_input_heap_buffers 3\n"); 4146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!handle) { 4149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 4150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 4151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((OMX_U32)handle->size < drv_ctx.ip_buf.buffer_size) { 4154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 4155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " expected %u, got %lu", 4156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.buffer_size, (OMX_U32)handle->size); 4157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 4158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!m_use_android_native_buffers) { 4161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buff = (OMX_U8*)mmap(0, handle->size, 4162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 4163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::use_input_heap_buffers 4 buff = %p\n", buff); 4164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buff == MAP_FAILED) { 4165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 4166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // we only need to copy this buffer (read only), no need to preserver this handle 4170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // this handle is saved for write-unlock in use_output_buffer case 4171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined(_ANDROID_ICS_) 4172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //native_buffer[i].nativehandle = handle; 4173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //native_buffer[i].privatehandle = handle; 4174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr[m_in_alloc_cnt].pPlatformPrivate = buff; 4176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //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", 4177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // 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); 4178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 4181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // user passes buffer in, but we need ION buffer 4182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("Inside %s 6 *bufferHdr = %p, byts = %lu \n", __FUNCTION__, *bufferHdr, bytes); 4183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes); 4184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]); 4185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], 4186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned)NULL, (unsigned)NULL)) 4187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 4189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_in_alloc_cnt++; 4192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 4196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 4197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 4199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 4203e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 4204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::use_input_buffers 4205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4206e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 4207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Use Buffer method implementation. 4208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4209e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 4210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 4211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4212e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 4213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None , if everything successful. 4214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 4216e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::use_input_buffers( 4217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_HANDLETYPE hComp, 4218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 port, 4220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR appData, 4221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 bytes, 4222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U8* buffer) 4223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR privateAppData = NULL; 4225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *input = NULL; 4226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 4227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin private_handle_t *handle = NULL; 4228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U8 *buff = buffer; 4230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int i = 0; 4231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer); 4233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 4234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!m_inp_heap_ptr) 4236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Inside %s 0, %p\n", __FUNCTION__, buffer); 4238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) 4239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 4240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.actualcount); 4241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!m_phdr_pmem_ptr) 4244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Inside %s 0-1, %p\n", __FUNCTION__, buffer); 4246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) 4247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 4248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.actualcount); 4249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!m_inp_heap_ptr || !m_phdr_pmem_ptr) 4252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Insufficent memory"); 4254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 4255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) 4257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 4259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_use_buffer = true; 4260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE)); 4261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // update this buffer for native window buffer in etb 4262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // OMXNodeInstance::useGraphicBuffer2_l check if pBuffer and pAppPrivate are 4263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // the same value as passed in. If not, useGraphicBuffer2_l will exit on error 4264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // 4265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer; 4266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes; 4267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData; 4268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput; 4269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax; 4270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // save mmapped native window buffer address to pPlatformPrivate 4271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // use this mmaped buffer address in etb_proxy 4272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_) 4273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*if(m_enable_android_native_buffers) */{ 4274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_use_android_native_buffers) { 4275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData; 4276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sp<android_native_buffer_t> nBuf = params->nativeBuffer; 4277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin handle = (private_handle_t *)nBuf->handle; 4278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin privateAppData = params->pAppPrivate; 4279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 4280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin handle = (private_handle_t *)buff; 4281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin privateAppData = appData; 4282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::use_input_heap_buffers 3\n"); 4283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!handle) { 4286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Native Buffer handle is NULL"); 4287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 4288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((OMX_U32)handle->size < drv_ctx.ip_buf.buffer_size) { 4291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback," 4292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " expected %u, got %lu", 4293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.buffer_size, (OMX_U32)handle->size); 4294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 4295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!m_use_android_native_buffers) { 4298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buff = (OMX_U8*)mmap(0, (handle->size - drv_ctx.ip_buf.frame_size), 4299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, drv_ctx.ip_buf.frame_size); 4300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::use_input_heap_buffers 4 buff = %p, size1=%d, size2=%d\n", buff, 4302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.buffer_size, 4303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin handle->size); 4304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buff == MAP_FAILED) { 4305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size); 4306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // we only need to copy this buffer (read only), no need to preserver this handle 4310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // this handle is saved for write-unlock in use_output_buffer case 4311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#if defined(_ANDROID_ICS_) 4312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //native_buffer[i].nativehandle = handle; 4313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //native_buffer[i].privatehandle = handle; 4314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr[m_in_alloc_cnt].pPlatformPrivate = buff; 4316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //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", 4317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // 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); 4318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt]; 4321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!m_inp_mem_ptr) 4323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Allocate i/p buffer Header: Cnt(%d) Sz(%d)", 4325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.actualcount, 4326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.buffer_size); 4327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 4329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 4330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_inp_mem_ptr == NULL) 4332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer = (struct vdpp_bufferpayload *) \ 4337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc ((sizeof (struct vdpp_bufferpayload)),drv_ctx.ip_buf.actualcount); 4338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ptr_inputbuffer == NULL) 4340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(i=0; i< drv_ctx.ip_buf.actualcount; i++) 4346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_ABSENT(&m_inp_bm_count,i)) 4348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free Input Buffer Index %d",i); 4350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(i < drv_ctx.ip_buf.actualcount) 4355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_buffer buf; 4357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_plane plane; 4358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc; 4359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_phdr_pmem_ptr[m_in_alloc_cnt] = (m_inp_mem_ptr + i); 4361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer [i].bufferaddr = buff; 4363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer [i].pmem_fd = handle->fd; 4364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 4365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer [i].mmaped_size = handle->size - drv_ctx.ip_buf.frame_size; 4366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer [i].offset = 0; 4367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input = m_phdr_pmem_ptr[m_in_alloc_cnt]; 4369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_inp_bm_count,i); 4370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer Buffer address %p of pmem",*bufferHdr); 4371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->pBuffer = (OMX_U8 *)buff; 4373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 4374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->nVersion.nVersion = OMX_SPEC_VERSION; 4375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->nAllocLen = drv_ctx.ip_buf.buffer_size; 4376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->pAppPrivate = appData; 4377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 4378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; // used in empty_this_buffer_proxy 4379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer input->pBuffer %p of pmem, input->pInputPortPrivate = %p",input->pBuffer, input->pInputPortPrivate); 4381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer memset drv_ctx.ip_buf.buffer_size = %d\n", drv_ctx.ip_buf.buffer_size); 4382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found"); 4387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 4388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt], 4391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned)NULL, (unsigned)NULL)) 4392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 4394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_in_alloc_cnt++; 4397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 4401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 4402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 4404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 4407e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 4408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::UseBuffer 4409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4410e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 4411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Use Buffer method implementation. 4412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4413e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 4414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 4415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4416e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 4417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None , if everything successful. 4418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 4420e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::use_buffer( 4421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_HANDLETYPE hComp, 4422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 port, 4424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR appData, 4425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 bytes, 4426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U8* buffer) 4427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE error = OMX_ErrorNone; 4429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_setbuffer_cmd setbuffers; 4430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((bufferHdr == NULL) || (bytes == 0) || (/*!secure_mode && */buffer == NULL)) 4432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer); 4434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 4435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StateInvalid) 4437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n"); 4439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInvalidState; 4440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(port == OMX_CORE_INPUT_PORT_INDEX) 4442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer); 4443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin error = use_input_buffers(hComp, bufferHdr, port, appData, bytes, buffer); // option to use vdec buffer 4444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(port == OMX_CORE_OUTPUT_PORT_INDEX) 4446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); 4447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port); 4450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin error = OMX_ErrorBadPortIndex; 4451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Use Buffer: port %lu, buffer %p, eRet %d", port, *bufferHdr, error); 4453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(error == OMX_ErrorNone) 4454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 4456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Send the callback now 4458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 4459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandStateSet,OMX_StateIdle, 4460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 4461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated && 4463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) 4464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 4466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandPortEnable, 4467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_INPUT_PORT_INDEX, 4468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 4469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated && 4471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) 4472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 4474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandPortEnable, 4475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_OUTPUT_PORT_INDEX, 4476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 4477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Use Buffer error = %d", error); 4480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return error; 4481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4483e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index = 0; 4486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (bufferHdr == NULL || m_inp_mem_ptr == NULL) 4487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 4489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin index = bufferHdr - m_inp_mem_ptr; 4492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // decrease m_in_alloc_cnt so use_input_heap_buffer can be called 4494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // again after port re-enable 4495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_in_alloc_cnt--; 4496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("free_input_buffer Free Input Buffer index = %d, m_in_alloc_cnt = %lu",index, m_in_alloc_cnt); 4497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) { 4499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Free Input ION Buffer index = %d",index); 4500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) { 4501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_setbuffer_cmd setbuffers; 4502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin setbuffers.buffer_type = VDPP_BUFFER_TYPE_INPUT; 4503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index], 4504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof (vdpp_bufferpayload)); 4505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" unmap the input buffer fd=%d", 4507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer[index].pmem_fd); 4508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" unmap the input buffer size=%d address = %p", 4509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer[index].mmaped_size, 4510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer[index].bufferaddr); 4511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr, 4512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer[index].mmaped_size); 4513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // If drv_ctx.ip_buf_ion_info is NULL then ION buffer is passed from upper layer. 4516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // don't close fd and free this buffer, leave upper layer close and free this buffer 4517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer[index].pmem_fd = -1; 4518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.ip_buf_ion_info != NULL) 4519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close (drv_ctx.ptr_inputbuffer[index].pmem_fd); 4521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin #ifdef USE_ION 4522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_ion_memory(&drv_ctx.ip_buf_ion_info[index]); 4523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin #endif 4524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 4529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4531e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 4532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index = 0; 4534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (bufferHdr == NULL || m_out_mem_ptr == NULL) 4536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 4538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin index = bufferHdr - m_out_mem_ptr; 4541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free output Buffer index = %d",index); 4542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (index < drv_ctx.op_buf.actualcount 4544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin && drv_ctx.ptr_outputbuffer) 4545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free output Buffer index = %d addr = %p", index, 4547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[index].bufferaddr); 4548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_setbuffer_cmd setbuffers; 4550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin setbuffers.buffer_type = VDPP_BUFFER_TYPE_OUTPUT; 4551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index], 4552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof (vdpp_bufferpayload)); 4553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _ANDROID_ 4554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_enable_android_native_buffers) { 4555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free output Buffer android pmem_fd=%d", drv_ctx.ptr_outputbuffer[index].pmem_fd); 4556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) { 4557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free output Buffer android 2 bufferaddr=%p, mmaped_size=%d", 4558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[index].bufferaddr, 4559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[index].mmaped_size); 4560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if( NULL != drv_ctx.ptr_outputbuffer[index].bufferaddr) 4561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr, 4563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[index].mmaped_size); 4564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 4567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 4568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) 4570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" unmap the output buffer fd = %d", 4573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[index].pmem_fd); 4574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" unmap the ouput buffer size=%d address = %p", 4575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[index].mmaped_size * drv_ctx.op_buf.actualcount, 4576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[index].bufferaddr); 4577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin munmap (drv_ctx.ptr_outputbuffer[index].bufferaddr, 4578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[index].mmaped_size * drv_ctx.op_buf.actualcount); 4579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close (drv_ctx.ptr_outputbuffer[index].pmem_fd); 4581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[index].pmem_fd = -1; 4582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 4583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_ion_memory(&drv_ctx.op_buf_ion_info[index]); 4584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _ANDROID_ 4587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (release_output_done()) { 4590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //free_extradata(); 4591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 4595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4598e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 4599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE **bufferHdr, 4600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 port, 4601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR appData, 4602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 bytes) 4603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *input = NULL; 4605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned char *buf_addr = NULL; 4606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 4607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i = 0; 4608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* Sanity Check*/ 4610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (bufferHdr == NULL) 4611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 4613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_inp_heap_ptr == NULL) 4616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \ 4618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc( (sizeof(OMX_BUFFERHEADERTYPE)), 4619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.actualcount); 4620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \ 4621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc( (sizeof(OMX_BUFFERHEADERTYPE*)), 4622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.actualcount); 4623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_inp_heap_ptr == NULL) || (m_phdr_pmem_ptr == NULL)) 4625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" m_inp_heap_ptr Allocation failed "); 4627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Find a Free index*/ 4632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(i=0; i< drv_ctx.ip_buf.actualcount; i++) 4633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_ABSENT(&m_heap_inp_bm_count,i)) 4635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free Input Buffer Index %d",i); 4637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (i < drv_ctx.ip_buf.actualcount) 4642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size); 4644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buf_addr == NULL) 4646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *bufferHdr = (m_inp_heap_ptr + i); 4651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input = *bufferHdr; 4652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_heap_inp_bm_count,i); 4653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->pBuffer = (OMX_U8 *)buf_addr; 4655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 4656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->nVersion.nVersion = OMX_SPEC_VERSION; 4657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->nAllocLen = drv_ctx.ip_buf.buffer_size; 4658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->pAppPrivate = appData; 4659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 4660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Address of Heap Buffer %p",*bufferHdr ); 4661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes); 4662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]); 4663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Add the Buffers to freeq*/ 4664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i], 4665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned)NULL, (unsigned)NULL)) 4666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:Free_q is full"); 4668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 4674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 4677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 4681e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 4682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::AllocateInputBuffer 4683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4684e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 4685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Helper function for allocate buffer in the input pin 4686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4687e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 4688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 4689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4690e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 4691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 4692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 4694e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::allocate_input_buffer( 4695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_HANDLETYPE hComp, 4696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 port, 4698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR appData, 4699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 bytes) 4700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 4703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_setbuffer_cmd setbuffers; 4704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *input = NULL; 4705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i = 0; 4706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned char *buf_addr = NULL; 4707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int pmem_fd = -1; 4708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(bytes != drv_ctx.ip_buf.buffer_size) 4710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Requested Size is wrong %lu expected is %d", 4712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytes, drv_ctx.ip_buf.buffer_size); 4713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 4714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!m_inp_mem_ptr) 4717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Allocate i/p buffer Header: Cnt(%d) Sz(%d)", 4719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.actualcount, 4720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.buffer_size); 4721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 4723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount); 4724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_inp_mem_ptr == NULL) 4726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer = (struct vdpp_bufferpayload *) \ 4731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc ((sizeof (struct vdpp_bufferpayload)),drv_ctx.ip_buf.actualcount); 4732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ptr_inputbuffer == NULL) 4734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 4738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf_ion_info = (struct vdpp_ion *) \ 4739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc ((sizeof (struct vdpp_ion)),drv_ctx.ip_buf.actualcount); 4740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ip_buf_ion_info == NULL) 4742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (i=0; i < drv_ctx.ip_buf.actualcount; i++) 4748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer [i].pmem_fd = -1; 4750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 4751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1; 4752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(i=0; i< drv_ctx.ip_buf.actualcount; i++) 4757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_ABSENT(&m_inp_bm_count,i)) 4759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free Input Buffer Index %d",i); 4761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(i < drv_ctx.ip_buf.actualcount) 4766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_buffer buf; 4768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_plane plane; 4769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc; 4770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer Allocate input Buffer, drv_ctx.ip_buf.buffer_size = %d", drv_ctx.ip_buf.buffer_size); 4771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 4772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory( 4773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment, 4774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &drv_ctx.ip_buf_ion_info[i].ion_alloc_data, 4775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &drv_ctx.ip_buf_ion_info[i].fd_ion_data, 0); 4776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) { 4777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd; 4780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_addr = (unsigned char *)mmap(NULL, 4784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf.buffer_size, 4785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0); 4786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buf_addr == MAP_FAILED) 4788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(pmem_fd); 4790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 4791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_ion_memory(&drv_ctx.ip_buf_ion_info[i]); 4792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Map Failed to allocate input buffer"); 4794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *bufferHdr = (m_inp_mem_ptr + i); 4798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr; 4800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd; 4801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size; 4802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size; 4803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer [i].offset = 0; 4804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input = *bufferHdr; 4806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_inp_bm_count,i); 4807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer Buffer address %p of pmem",*bufferHdr); 4808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->pBuffer = (OMX_U8 *)buf_addr; 4810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->nSize = sizeof(OMX_BUFFERHEADERTYPE); 4811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->nVersion.nVersion = OMX_SPEC_VERSION; 4812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->nAllocLen = drv_ctx.ip_buf.buffer_size; 4813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->pAppPrivate = appData; 4814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX; 4815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i]; // used in empty_this_buffer_proxy 4816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer input->pBuffer %p of pmem, input->pInputPortPrivate = %p",input->pBuffer, input->pInputPortPrivate); 4818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(buf_addr, 0, drv_ctx.ip_buf.buffer_size); 4819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::allocate_input_buffer memset drv_ctx.ip_buf.buffer_size = %d\n", drv_ctx.ip_buf.buffer_size); 4820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found"); 4824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 4825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 4827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 4831e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 4832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::AllocateOutputBuffer 4833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4834e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 4835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Helper fn for AllocateBuffer in the output pin 4836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4837e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 4838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 4839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4840e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 4841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None if everything went well. 4842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 4844e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::allocate_output_buffer( 4845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_HANDLETYPE hComp, 4846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 4847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 port, 4848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR appData, 4849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 bytes) 4850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 4852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 4853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i= 0; // Temporary counter 4854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_setbuffer_cmd setbuffers; 4855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int extra_idx = 0; 4856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 4857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int ion_device_fd =-1; 4858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct ion_allocation_data ion_alloc_data; 4859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct ion_fd_data fd_ion_data; 4860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!m_out_mem_ptr) 4862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Allocate o/p buffer Header: Cnt(%d) Sz(%d)", 4864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.actualcount, 4865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.buffer_size); 4866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int nBufHdrSize = 0; 4867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int pmem_fd = -1; 4868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned char *pmem_baseaddress = NULL; 4869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n", 4871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.actualcount); 4872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nBufHdrSize = drv_ctx.op_buf.actualcount * 4873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(OMX_BUFFERHEADERTYPE); 4874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 4875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_device_fd = alloc_map_ion_memory( 4876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount, 4877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.alignment, 4878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &ion_alloc_data, &fd_ion_data, 0); 4879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ion_device_fd < 0) { 4880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_fd = fd_ion_data.fd; 4883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_baseaddress = (unsigned char *)mmap(NULL, 4887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (drv_ctx.op_buf.buffer_size * 4888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.actualcount), 4889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0); 4890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pmem_baseaddress == MAP_FAILED) 4891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" MMAP failed for Size %d", 4893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.buffer_size); 4894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(pmem_fd); 4895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 4896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_ion_memory(&drv_ctx.op_buf_ion_info[i]); 4897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 4903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer = (struct vdpp_bufferpayload *)\ 4905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc (sizeof(struct vdpp_bufferpayload), 4906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.actualcount); 4907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_respbuffer = (struct vdpp_output_frameinfo *)\ 4908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc (sizeof (struct vdpp_output_frameinfo), 4909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.actualcount); 4910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 4911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf_ion_info = (struct vdpp_ion *)\ 4912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc (sizeof(struct vdpp_ion), 4913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.actualcount); 4914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!drv_ctx.op_buf_ion_info) { 4916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info"); 4917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 4918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_out_mem_ptr /*&& pPtr*/ && drv_ctx.ptr_outputbuffer 4922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin && drv_ctx.ptr_respbuffer) 4923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[0].mmaped_size = 4925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (drv_ctx.op_buf.buffer_size * 4926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.actualcount); 4927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr = m_out_mem_ptr; 4928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr); 4930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(i=0; i < drv_ctx.op_buf.actualcount ; i++) 4932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 4934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 4935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Set the values when we determine the right HxW param 4936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->nAllocLen = bytes; 4937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->nFilledLen = 0; 4938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->pAppPrivate = appData; 4939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 4940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->pBuffer = NULL; 4941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->nOffset = 0; 4942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd; 4944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 4945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd; 4946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data; 4947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data; 4948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Create a mapping between buffers*/ 4951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 4952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_respbuffer[i].client_data = (void *)\ 4953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &drv_ctx.ptr_outputbuffer[i]; 4954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i; 4955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].bufferaddr = 4956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i); 4957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" pmem_fd = %d offset = %d address = %p", 4959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_fd, drv_ctx.ptr_outputbuffer[i].offset, 4960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].bufferaddr); 4961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Move the buffer and buffer header pointers 4962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr++; 4963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_out_mem_ptr) 4969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(m_out_mem_ptr); 4971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_mem_ptr = NULL; 4972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.ptr_outputbuffer) 4975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(drv_ctx.ptr_outputbuffer); 4977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer = NULL; 4978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.ptr_respbuffer) 4980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(drv_ctx.ptr_respbuffer); 4982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_respbuffer = NULL; 4983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 4985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.op_buf_ion_info) { 4986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free o/p ion context"); 4987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(drv_ctx.op_buf_ion_info); 4988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf_ion_info = NULL; 4989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 4991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 4992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(i=0; i< drv_ctx.op_buf.actualcount; i++) 4996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_ABSENT(&m_out_bm_count,i)) 4998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Found a Free Output Buffer %d",i); 5000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (eRet == OMX_ErrorNone) 5005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(i < drv_ctx.op_buf.actualcount) 5007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_buffer buf; 5009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_plane plane[VIDEO_MAX_PLANES]; 5010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc; 5011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].buffer_len = 5013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.buffer_size; 5014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *bufferHdr = (m_out_mem_ptr + i ); 5016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size; 5017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 5019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) { 5020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin enum v4l2_buf_type buf_type; 5021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 5022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc=ioctl(drv_ctx.video_vpu_fd, VIDIOC_STREAMON,&buf_type); 5023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc) { 5024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("allocate_output_buffer STREAMON failed \n "); 5025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 5026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 5027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin streaming[CAPTURE_PORT] = true; 5028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("allocate_output_buffer STREAMON Successful \n "); 5029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 5032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr; 5034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*bufferHdr)->pAppPrivate = appData; 5035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_SET(&m_out_bm_count,i); 5036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n"); 5040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 5041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 5045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// AllocateBuffer -- API Call 5049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 5050e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 5051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::AllocateBuffer 5052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5053e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 5054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Returns zero if all the buffers released.. 5055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5056e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 5057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 5058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5059e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 5060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 5061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 5063e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp, 5064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 5065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 port, 5066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR appData, 5067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 bytes) 5068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i = 0; 5070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type 5071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Allocate buffer on port %d \n", (int)port); 5073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StateInvalid) 5074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n"); 5076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInvalidState; 5077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(port == OMX_CORE_INPUT_PORT_INDEX) 5080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = allocate_input_heap_buffer(hComp,bufferHdr,port,appData,bytes); 5082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(port == OMX_CORE_OUTPUT_PORT_INDEX) 5084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = allocate_output_buffer(hComp,bufferHdr,port,appData,bytes); 5086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port); 5090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadPortIndex; 5091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done"); 5093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eRet == OMX_ErrorNone) 5094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(allocate_done()){ 5096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 5097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Send the callback now 5099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 5100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandStateSet,OMX_StateIdle, 5101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 5102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) 5105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) 5107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 5109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandPortEnable, 5110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_INPUT_PORT_INDEX, 5111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 5112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) 5115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) 5117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 5119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandPortEnable, 5120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_OUTPUT_PORT_INDEX, 5121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 5122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet); 5126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 5127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// Free Buffer - API call 5130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 5131e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 5132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::FreeBuffer 5133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5134e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 5135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5136e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 5137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 5138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5139e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 5140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 5141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 5143e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::free_buffer(OMX_IN OMX_HANDLETYPE hComp, 5144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 port, 5145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 5148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int nPortIndex; 5149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("In for vdpp free_buffer \n"); 5150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StateIdle && 5152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) 5153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n"); 5155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)|| 5157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) 5158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Free Buffer while port %lu disabled\n", port); 5160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause) 5162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n"); 5164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError, 5165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorPortUnpopulated, 5166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 5167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorIncorrectStateOperation; 5169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_state != OMX_StateInvalid) 5171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n"); 5173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_EventError, 5174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorPortUnpopulated, 5175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 5176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(port == OMX_CORE_INPUT_PORT_INDEX) 5179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Check if arbitrary bytes*/ 5181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!input_use_buffer) 5182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nPortIndex = buffer - m_inp_mem_ptr; 5183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nPortIndex = buffer - m_inp_heap_ptr; 5185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex); 5187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(nPortIndex < drv_ctx.ip_buf.actualcount) 5188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Clear the bit associated with it. 5190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); 5191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex); 5192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (input_use_buffer == true) 5193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free pmem Buffer index %d",nPortIndex); 5196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_phdr_pmem_ptr) 5197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_input_buffer(m_phdr_pmem_ptr[nPortIndex]); 5198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_input_buffer(buffer); 5202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_bPopulated = OMX_FALSE; 5204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Free the Buffer Header*/ 5205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (release_input_done()) 5206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" ALL input buffers are freed/released"); 5208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_input_buffer_header(); 5209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n"); 5214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadPortIndex; 5215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING) 5218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin && release_input_done()) 5219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n"); 5221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING); 5222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandPortDisable, 5223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_INPUT_PORT_INDEX, 5224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 5225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if(port == OMX_CORE_OUTPUT_PORT_INDEX) 5228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // check if the buffer is valid 5230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nPortIndex = buffer - (OMX_BUFFERHEADERTYPE*)m_out_mem_ptr; 5231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(nPortIndex < drv_ctx.op_buf.actualcount) 5232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex); 5234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Clear the bit associated with it. 5235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR(&m_out_bm_count,nPortIndex); 5236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_bPopulated = OMX_FALSE; 5237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_output_buffer (buffer); 5238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (release_output_done()) 5240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_output_buffer_header(); 5242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n"); 5247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadPortIndex; 5248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING) 5250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin && release_output_done()) 5251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n"); 5253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n"); 5255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 5256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _ANDROID_ICS_ 5257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_enable_android_native_buffers) 5258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers"); 5260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS)); 5261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 5263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandPortDisable, 5265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_OUTPUT_PORT_INDEX, 5266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 5267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadPortIndex; 5272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if((eRet == OMX_ErrorNone) && 5274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) 5275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(release_done()) 5277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Send the callback now 5279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); 5280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event(OMX_CommandStateSet, OMX_StateLoaded, 5281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT); 5282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 5285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 5289e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 5290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::EmptyThisBuffer 5291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5292e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 5293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin This routine is used to push the video frames to VDPP. 5294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5295e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 5296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 5297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5298e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 5299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None if everything went successful. 5300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 5302e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 5303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE ret1 = OMX_ErrorNone; 5306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount; 5307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer buffer = %p, buffer->pBuffer = %p, buffer->pPlatformPrivate = %p, buffer->nFilledLen = %lu\n", 5309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // buffer, buffer->pBuffer, buffer->pPlatformPrivate, buffer->nFilledLen); 5310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StateInvalid) 5311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n"); 5313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInvalidState; 5314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buffer == NULL) 5317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL"); 5319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 5320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!m_inp_bEnabled) 5323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled."); 5325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorIncorrectStateOperation; 5326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) 5329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %lu", buffer->nInputPortIndex); 5331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadPortIndex; 5332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (input_use_buffer == true) 5335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nBufferIndex = buffer - m_inp_heap_ptr; 5337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen; 5338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp; 5339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags; 5340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer = &m_inp_mem_ptr[nBufferIndex]; // change heap buffer address to ION buffer address 5341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem %p in Index %d, buffer %p of size %lu", 5342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen); 5343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else{ 5345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nBufferIndex = buffer - m_inp_mem_ptr; 5346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (nBufferIndex > drv_ctx.ip_buf.actualcount ) 5349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid"); 5351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 5352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)", 5355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen); 5356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin set_frame_rate(buffer->nTimeStamp); 5358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB); 5359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 5361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 5364e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 5365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::empty_this_buffer_proxy 5366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5367e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 5368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin This routine is used to push the video decoder output frames to 5369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin the VDPP. 5370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5371e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 5372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 5373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5374e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 5375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None if everything went successful. 5376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 5378e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, 5379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int i=0; 5382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned nPortIndex = 0; 5383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE ret = OMX_ErrorNone; 5384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_bufferpayload *temp_buffer; 5385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p1 = 0; 5386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p2 = 0; 5387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 1\n"); 5389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Should we generate a Aync error event*/ 5390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buffer == NULL || buffer->pInputPortPrivate == NULL) 5391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid"); 5393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 5394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 5397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("omx_vdpp::empty_this_buffer_proxy 2 nPortIndex = %d, buffer->nFilledLen = %lu\n", nPortIndex, buffer->nFilledLen); 5398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (nPortIndex > drv_ctx.ip_buf.actualcount) 5399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]", 5401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nPortIndex); 5402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 5403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_input_buffers++; 5406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 3 pending_input_buffers = %d\n", pending_input_buffers); 5407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* return zero length and not an EOS buffer */ 5408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((buffer->nFilledLen == 0) && 5409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) 5410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" return zero legth buffer"); 5412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event ((unsigned int)buffer,VDPP_S_SUCCESS, 5413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EBD); 5414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 5415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // check OMX_BUFFERFLAG_EXTRADATA for interlaced information 5418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // and set it to drv_ctx.interlace if returned interlace mode 5419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // doesn't match drv_ctx.interlace. 5420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 3 buffer->nFlags = 0x%x interlace_user_flag = %d ", buffer->nFlags, interlace_user_flag); 5421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(((buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) != 0) && (false == interlace_user_flag)) 5422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_OTHER_EXTRADATATYPE *pExtra; 5424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_field field = drv_ctx.interlace;// V4L2_FIELD_NONE; 5425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U8 *pTmp = buffer->pBuffer + buffer->nOffset + 3; 5426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pExtra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U32) pTmp) & ~3); 5428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 3 buffer->nFlags = 0x%x, pExtra->eType = 0x%x\n", buffer->nFlags, pExtra->eType); 5429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // traverset the list of extra data sections 5430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while(OMX_ExtraDataNone != pExtra->eType) 5431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(OMX_ExtraDataInterlaceFormat == (OMX_QCOM_EXTRADATATYPE)pExtra->eType) 5433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STREAMINTERLACEFORMAT *interlace_format; 5435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin interlace_format = (OMX_STREAMINTERLACEFORMAT *)pExtra->data; 5436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (interlace_format->nInterlaceFormats) 5438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_InterlaceFrameProgressive: 5440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin field = V4L2_FIELD_NONE; 5442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy V4L2_FIELD_NONE"); 5443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_InterlaceInterleaveFrameTopFieldFirst: 5446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin field = V4L2_FIELD_INTERLACED_TB; 5448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy V4L2_FIELD_INTERLACED_TB"); 5449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_InterlaceInterleaveFrameBottomFieldFirst: 5452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin field = V4L2_FIELD_INTERLACED_BT; 5454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy V4L2_FIELD_INTERLACED_BT"); 5455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_InterlaceFrameTopFieldFirst: 5458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin field = V4L2_FIELD_SEQ_TB; 5460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_InterlaceFrameBottomFieldFirst: 5463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin field = V4L2_FIELD_SEQ_BT; 5465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 5468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pExtra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) pExtra) + pExtra->nSize); 5473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.interlace != field) 5476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.interlace = field; 5478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // set input port format based on the detected interlace mode 5480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = set_buffer_req(&drv_ctx.ip_buf); 5481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(OMX_ErrorNone != ret) 5482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid format setting"); 5484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return ret; 5485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 4 \n"); 5490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(input_flush_progress == true) 5491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Flush in progress return buffer "); 5493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event ((unsigned int)buffer,VDPP_S_SUCCESS, 5494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EBD); 5495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 5496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp_buffer = (struct vdpp_bufferpayload *)buffer->pInputPortPrivate; 5499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((temp_buffer - drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) 5501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 5503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW(" ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); 5506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*for use_input_heap_buffer memcpy is used*/ 5507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp_buffer->buffer_len = buffer->nFilledLen; 5508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (input_use_buffer) 5511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 5 \n"); 5513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buffer->nFilledLen <= temp_buffer->buffer_len) 5514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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", 5516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp_buffer->bufferaddr, nPortIndex, m_inp_heap_ptr[nPortIndex].pPlatformPrivate, nPortIndex, m_inp_heap_ptr[nPortIndex].nOffset); 5517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pPlatformPrivate + m_inp_heap_ptr[nPortIndex].nOffset), 5518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // buffer->nFilledLen); 5519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 5523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 5.2 \n"); 5525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef INPUT_BUFFER_LOG 5528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((inputBufferFile >= 0) && (input_buffer_write_counter < 10)) 5529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int stride = drv_ctx.video_resolution_input.stride; //w 5531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int scanlines = drv_ctx.video_resolution_input.scan_lines; //h 5532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 5533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin char *temp = (char *)temp_buffer->bufferaddr; 5534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i; 5535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int bytes_written = 0; 5536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (i = 0; i < drv_ctx.video_resolution_input.frame_height; i++) { 5537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytes_written = write(inputBufferFile, temp, drv_ctx.video_resolution_input.frame_width); 5538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp += stride; 5539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp = (char *)(char *)temp_buffer->bufferaddr + stride * scanlines; 5541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int stride_c = stride; 5542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(i = 0; i < drv_ctx.video_resolution_input.frame_height/2; i++) { 5543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytes_written += write(inputBufferFile, temp, drv_ctx.video_resolution_input.frame_width); 5544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp += stride_c; 5545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_buffer_write_counter++; 5547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(input_buffer_write_counter >= 10 ) 5550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(inputBufferFile); 5552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 5554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 5.3 \n"); 5556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) 5557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 5.4 \n"); 5559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 5560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_buffer buf; 5563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_plane plane[VIDEO_MAX_PLANES]; 5564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int extra_idx = 0; 5565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc; 5566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned long print_count; 5567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset( (void *)&buf, 0, sizeof(buf)); 5569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES)); 5570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) 5572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { buf.flags = V4L2_QCOM_BUF_FLAG_EOS; 5573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("temp_buffer->buffer_len = %d, buffer->nFlags = 0x%lx \n", temp_buffer->buffer_len, buffer->nFlags) ; 5574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" INPUT EOS reached \n") ; 5575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 5578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // The following fills v4l2_buffer structure 5580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.index = nPortIndex; 5581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 5582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.field = drv_ctx.interlace; 5583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.memory = V4L2_MEMORY_USERPTR; 5584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.length = drv_ctx.input_num_planes; 5585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // currently V4L2 driver just passes timestamp to maple FW, and maple FW 5587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // pass the timestamp back to OMX 5588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *(uint64_t *)(&buf.timestamp) = buffer->nTimeStamp; 5589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].bytesused = drv_ctx.video_resolution_input.frame_width * 5591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.frame_height * 5592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.input_bytesperpixel[0];//buffer->nFilledLen = 0 at this stage 5593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].length = paddedFrameWidth128(drv_ctx.video_resolution_input.frame_width) * 5594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.frame_height * 5595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.input_bytesperpixel[0]; 5596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].m.userptr = temp_buffer->pmem_fd; 5597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].reserved[0] = 0; 5598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extra_idx = EXTRADATA_IDX(drv_ctx.input_num_planes); 5599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((extra_idx > 0) && (extra_idx < VIDEO_MAX_PLANES)) { 5600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].bytesused = drv_ctx.video_resolution_input.frame_width * 5601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.frame_height * 5602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.input_bytesperpixel[extra_idx]; 5603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].length = paddedFrameWidth128(drv_ctx.video_resolution_input.frame_width) * 5604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.frame_height * 5605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.input_bytesperpixel[extra_idx]; 5606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].m.userptr = temp_buffer->pmem_fd; 5609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].reserved[0] = plane[0].reserved[0] + drv_ctx.video_resolution_input.stride * drv_ctx.video_resolution_input.scan_lines; 5610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (extra_idx >= VIDEO_MAX_PLANES) { 5611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx); 5612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 5613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.m.planes = plane; 5615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.length = drv_ctx.input_num_planes; 5616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy: buffer->nFilledLen = %d, plane[0].bytesused = %d plane[0].length = %d,\ 5617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].bytesused = %d, plane[extra_idx].length = %d, plane[extra_idx].data_offset = %d plane[0].data_offset = %d\ 5618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.timestamp.tv_sec = 0x%08x, buf.timestamp.tv_usec = 0x%08x\n", 5619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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, 5620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.timestamp.tv_sec, buf.timestamp.tv_usec); 5621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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", 5622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->nTimeStamp, buf.timestamp.tv_sec, buf.timestamp.tv_usec);*/ 5623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_qbuf_count++; 5625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef STUB_VPU 5627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else 5629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(drv_ctx.video_vpu_fd, VIDIOC_QBUF, &buf); 5630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(rc) 5631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver\n"); 5633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorHardware; 5634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 5636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 15 \n"); 5638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 5639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!streaming[OUTPUT_PORT]) 5640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin enum v4l2_buf_type buf_type; 5642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int ret,r; 5643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::empty_this_buffer_proxy 16 \n"); 5644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 5645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n"); 5646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret=ioctl(drv_ctx.video_vpu_fd, VIDIOC_STREAMON,&buf_type); 5647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!ret) { 5648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE STREAMON Successful \n"); 5649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin streaming[OUTPUT_PORT] = true; 5650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else{ 5651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" \n Failed to call streamon on V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE \n"); 5652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 5653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 5656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef STUB_VPU 5658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.etb_ftb_info.etb_cnt++; 5659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 5660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_index_q_etb.insert_entry(p1,p2,nPortIndex); 5661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //drv_ctx.etb_ftb_info.etb_index = nPortIndex; 5662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.etb_ftb_info.etb_len = buf.length; 5663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post (&(drv_ctx.async_lock)); 5664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 5665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return ret; 5666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 5669e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 5670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::FillThisBuffer 5671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5672e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 5673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin IL client uses this method to release the frame buffer 5674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin after displaying them. 5675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5676e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 5677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 5678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5679e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 5680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 5681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 5683e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 5684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_BUFFERHEADERTYPE* buffer) 5685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state == OMX_StateInvalid) 5688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("FTB in Invalid State\n"); 5690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInvalidState; 5691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!m_out_bEnabled) 5694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled."); 5696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorIncorrectStateOperation; 5697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buffer == NULL || 5700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)) 5701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 5703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) 5706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex); 5708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadPortIndex; 5709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p, buffer->nFilledLen = %lu", buffer, buffer->pBuffer, buffer->nFilledLen); 5711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg); 5712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 5714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 5716e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 5717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::fill_this_buffer_proxy 5718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5719e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 5720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin IL client uses this method to release the frame buffer 5721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin after displaying them. 5722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5723e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 5724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 5725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5726e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 5727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 5728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 5730e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::fill_this_buffer_proxy( 5731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_HANDLETYPE hComp, 5732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd) 5733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE nRet = OMX_ErrorNone; 5735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *buffer = bufferAdd; 5736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned nPortIndex = 0; 5737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_bufferpayload *ptr_outputbuffer = NULL; 5738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_output_frameinfo *ptr_respbuffer = NULL; 5739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin private_handle_t *handle = NULL; 5740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p1 = 0; 5742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p2 = 0; 5743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_out_mem_ptr); 5745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) 5747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 5748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" FTBProxy: nPortIndex = %d, bufhdr = %p, bufhdr->pBuffer = %p, buffer->nFilledLen = %lu", 5750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nPortIndex, bufferAdd, bufferAdd->pBuffer, buffer->nFilledLen); 5751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Return back the output buffer to client*/ 5753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true) 5754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Output Buffers return flush/disable condition"); 5756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->nFilledLen = 0; 5757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cb.FillBufferDone (hComp,m_app_data,buffer); 5758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 5759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_output_buffers++; 5761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // set from allocate_output_headers 5763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ptr_respbuffer = (struct vdpp_output_frameinfo*)buffer->pOutputPortPrivate; 5764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ptr_respbuffer) 5765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ptr_outputbuffer = (struct vdpp_bufferpayload*)ptr_respbuffer->client_data; 5767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) 5770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL"); 5772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->nFilledLen = 0; 5773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cb.FillBufferDone (hComp,m_app_data,buffer); 5774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_output_buffers--; 5775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 5776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc = 0; 5779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_buffer buf; 5780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_plane plane[VIDEO_MAX_PLANES]; 5781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int extra_idx = 0; 5782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset( (void *)&buf, 0, sizeof(buf)); 5783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES)); 5784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.index = nPortIndex; 5786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 5787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.memory = V4L2_MEMORY_USERPTR; 5788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.field = V4L2_FIELD_ANY; 5789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.length = drv_ctx.output_num_planes; 5791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].bytesused = drv_ctx.video_resolution_output.frame_width * 5792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_height * 5793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_bytesperpixel[0]; 5794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].length = paddedFrameWidth128(drv_ctx.video_resolution_output.frame_width) * 5795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_height * 5796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_bytesperpixel[0]; 5797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].m.userptr = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 5799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[0].reserved[0] = 0; 5800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extra_idx = EXTRADATA_IDX(drv_ctx.output_num_planes); 5801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((extra_idx > 0) && (extra_idx < VIDEO_MAX_PLANES)) { 5802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].bytesused = drv_ctx.video_resolution_output.frame_width * 5803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_height * 5804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_bytesperpixel[extra_idx]; 5805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].length = paddedFrameWidth128(drv_ctx.video_resolution_output.frame_width) * 5806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_height * 5807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_bytesperpixel[extra_idx]; 5808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane[extra_idx].m.userptr = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd; 5809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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; 5810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (extra_idx >= VIDEO_MAX_PLANES) { 5811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx); 5812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 5813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf.m.planes = plane; 5815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // DEBUG_PRINT_LOW("omx_vdpp::fill_this_buffer_proxy: buffer->nFilledLen = %lu, plane[0].bytesused = %d plane[0].length = %d, \ 5816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // plane[extra_idx].bytesused = %d, plane[extra_idx].reserved[0] = 0x%x\n", \ 5817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // buffer->nFilledLen, plane[0].bytesused, plane[0].length, plane[extra_idx].bytesused, plane[extra_idx].reserved[0]); 5818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // 5819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //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); 5820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::fill_this_buffer_proxy 2 drv_ctx.ptr_outputbuffer[%d].offset = %d", nPortIndex,drv_ctx.ptr_outputbuffer[nPortIndex].offset); 5821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef STUB_VPU 5823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else 5825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(drv_ctx.video_vpu_fd, VIDIOC_QBUF, &buf); 5826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc) { 5827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to qbuf to driver"); 5828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorHardware; 5829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 5831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_qbuf_count++; 5833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::fill_this_buffer_proxy 3\n"); 5834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef STUB_VPU 5835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.etb_ftb_info.ftb_cnt++; 5837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_index_q_ftb.insert_entry(p1,p2,nPortIndex); 5838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.etb_ftb_info.ftb_len = drv_ctx.op_buf.buffer_size; 5839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post (&(drv_ctx.async_lock)); 5840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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", 5841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nPortIndex, drv_ctx.etb_ftb_info.ftb_cnt, drv_ctx.etb_ftb_info.ftb_len); 5842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 5844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 5845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 5849e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 5850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::SetCallbacks 5851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5852e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 5853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Set the callbacks. 5854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5855e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 5856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 5857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5858e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 5859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None if everything successful. 5860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 5862e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::set_callbacks(OMX_IN OMX_HANDLETYPE hComp, 5863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_CALLBACKTYPE* callbacks, 5864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR appData) 5865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cb = *callbacks; 5868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\ 5869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cb.EventHandler,m_cb.FillBufferDone); 5870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_app_data = appData; 5871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNotImplemented; 5872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 5875e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 5876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::ComponentDeInit 5877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5878e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 5879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Destroys the component and release memory allocated to the heap. 5880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5881e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 5882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 5883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5884e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 5885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None if everything successful. 5886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 5888e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::component_deinit(OMX_IN OMX_HANDLETYPE hComp) 5889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i = 0; 5891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" omx_vdpp::component_deinit"); 5892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (OMX_StateLoaded != m_state) 5893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\ 5895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state); 5896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Playback Ended - FAILED"); 5897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Playback Ended - PASSED"); 5901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Check if the output buffers have to be cleaned up*/ 5904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_out_mem_ptr) 5905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Freeing the Output Memory\n"); 5907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) 5908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_output_buffer (&m_out_mem_ptr[i]); 5910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Check if the input buffers have to be cleaned up*/ 5914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_inp_mem_ptr || m_inp_heap_ptr) 5915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Freeing the Input Memory\n"); 5917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) 5918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_inp_mem_ptr) 5920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_input_buffer (&m_inp_mem_ptr[i]); 5921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_input_buffer_header(); 5924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_output_buffer_header(); 5925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Reset counters in mesg queues 5927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ftb_q.m_size=0; 5928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cmd_q.m_size=0; 5929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_etb_q.m_size=0; 5930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_index_q_ftb.m_size=0; 5931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_index_q_etb.m_size=0; 5932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ftb_q.m_read = m_ftb_q.m_write =0; 5933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cmd_q.m_read = m_cmd_q.m_write =0; 5934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_etb_q.m_read = m_etb_q.m_write =0; 5935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_index_q_ftb.m_read = m_index_q_ftb.m_write =0; 5936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_index_q_etb.m_read = m_index_q_etb.m_write =0; 5937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _ANDROID_ 5938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_debug_timestamp) 5939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_timestamp_list.reset_ts_list(); 5941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 5943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Close the driver instance"); 5945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef INPUT_BUFFER_LOG 5947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (inputBufferFile) 5948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close (inputBufferFile); 5949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 5950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef OUTPUT_BUFFER_LOG 5951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (outputBufferFile) 5952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(outputBufferFile); 5953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 5954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef OUTPUT_EXTRADATA_LOG 5955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (outputExtradataFile) 5956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fclose (outputExtradataFile); 5957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 5958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" omx_vdpp::component_deinit() complete"); 5960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 5961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 5963e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 5964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::UseEGLImage 5965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5966e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 5967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Use EGL Image method implementation <TBD>. 5968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5969e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 5970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 5971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5972e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 5973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Not Implemented error. 5974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 5976e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp, 5977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 5978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 port, 5979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_PTR appData, 5980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN void* eglImage) 5981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 5983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 5985e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 5986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::ComponentRoleEnum 5987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5988e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 5989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Component Role Enum method implementation. 5990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5991e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 5992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin <TBD>. 5993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5994e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 5995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX Error None if everything is successful. 5996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 5997e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, 5998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_OUT OMX_U8* role, 5999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_IN OMX_U32 index) 6000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 6002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // no component role (TODO add it later once component role is determined) 6004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* 6005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!strncmp(drv_ctx.kind, "OMX.qcom.video.vidpp",OMX_MAX_STRINGNAME_SIZE)) 6006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if((0 == index) && role) 6008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char *)role, "video.vidpp",OMX_MAX_STRINGNAME_SIZE); 6010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("component_role_enum: role %s\n",role); 6011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorNoMore; 6015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin*/ 6018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 6019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 6025e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 6026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::AllocateDone 6027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6028e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 6029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Checks if entire buffer pool is allocated by IL Client or not. 6030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Need this to move to IDLE state. 6031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6032e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 6033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 6034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6035e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 6036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false. 6037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 6039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::allocate_done(void) 6040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool bRet = false; 6042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool bRet_In = false; 6043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool bRet_Out = false; 6044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::allocate_done 1\n"); 6046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bRet_In = allocate_input_done(); 6047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bRet_Out = allocate_output_done(); 6048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(bRet_In && bRet_Out) 6050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bRet = true; 6052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::allocate_done 2\n"); 6053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::allocate_done 3\n"); 6055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return bRet; 6056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 6058e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 6059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::AllocateInputDone 6060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6061e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 6062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Checks if I/P buffer pool is allocated by IL Client or not. 6063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6064e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 6065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 6066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6067e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 6068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false. 6069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 6071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::allocate_input_done(void) 6072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool bRet = false; 6074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i=0; 6075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::allocate_input_done 1\n"); 6076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_inp_mem_ptr == NULL) 6077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::allocate_input_done 2\n"); 6079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return bRet; 6080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_inp_mem_ptr ) 6082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::allocate_input_done 3\n"); 6084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(;i<drv_ctx.ip_buf.actualcount;i++) 6085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_ABSENT(&m_inp_bm_count,i)) 6087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::allocate_input_done 4 i = %d, drv_ctx.ip_buf.actualcount = %d\n", i, drv_ctx.ip_buf.actualcount); 6093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(i == drv_ctx.ip_buf.actualcount) 6094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::allocate_input_done 5\n"); 6096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bRet = true; 6097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_HIGH("Allocate done for all i/p buffers"); 6098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) 6100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_bPopulated = OMX_TRUE; 6102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return bRet; 6104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 6106e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 6107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::AllocateOutputDone 6108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6109e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 6110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Checks if entire O/P buffer pool is allocated by IL Client or not. 6111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6112e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 6113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 6114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6115e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 6116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false. 6117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 6119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::allocate_output_done(void) 6120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool bRet = false; 6122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned j=0; 6123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_out_mem_ptr == NULL) 6125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return bRet; 6127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_out_mem_ptr) 6130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(;j < drv_ctx.op_buf.actualcount;j++) 6132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_ABSENT(&m_out_bm_count,j)) 6134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(j == drv_ctx.op_buf.actualcount) 6141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bRet = true; 6143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Allocate done for all o/p buffers"); 6144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_out_bEnabled) 6145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_bPopulated = OMX_TRUE; 6146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return bRet; 6149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 6152e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 6153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::ReleaseDone 6154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6155e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 6156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Checks if IL client has released all the buffers. 6157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6158e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 6159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 6160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6161e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 6162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 6163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 6165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::release_done(void) 6166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool bRet = false; 6168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(release_input_done()) 6170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(release_output_done()) 6172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bRet = true; 6174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return bRet; 6177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 6181e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 6182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::ReleaseOutputDone 6183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6184e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 6185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Checks if IL client has released all the buffers. 6186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6187e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 6188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 6189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6190e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 6191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 6192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 6194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::release_output_done(void) 6195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool bRet = false; 6197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i=0,j=0; 6198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::release_output_done Value of m_out_mem_ptr %p",m_inp_mem_ptr); 6200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_out_mem_ptr) 6201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(;j < drv_ctx.op_buf.actualcount ; j++) 6203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(BITMASK_PRESENT(&m_out_bm_count,j)) 6205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(j == drv_ctx.op_buf.actualcount) 6210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_bm_count = 0; 6212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bRet = true; 6213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_bm_count = 0; 6218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bRet = true; 6219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return bRet; 6221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/* ====================================================================== 6223e4010605f233a213cf0d972397bb33c34c364227Patrick TjinFUNCTION 6224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp::ReleaseInputDone 6225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6226e4010605f233a213cf0d972397bb33c34c364227Patrick TjinDESCRIPTION 6227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin Checks if IL client has released all the buffers. 6228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6229e4010605f233a213cf0d972397bb33c34c364227Patrick TjinPARAMETERS 6230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin None. 6231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6232e4010605f233a213cf0d972397bb33c34c364227Patrick TjinRETURN VALUE 6233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin true/false 6234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin========================================================================== */ 6236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::release_input_done(void) 6237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool bRet = false; 6239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i=0,j=0; 6240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::release_input_done Value of m_inp_mem_ptr %p",m_inp_mem_ptr); 6242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_inp_mem_ptr) 6243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(;j<drv_ctx.ip_buf.actualcount;j++) 6245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if( BITMASK_PRESENT(&m_inp_bm_count,j)) 6247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(j==drv_ctx.ip_buf.actualcount) 6252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bRet = true; 6254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bRet = true; 6259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return bRet; 6261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6263e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::fill_buffer_done(OMX_HANDLETYPE hComp, 6264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE * buffer) 6265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL; 6267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW(" fill_buffer_done 1 : bufhdr = %p, bufhdr->pBuffer = %p, buffer->nFilledLen = %lu", 6268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // buffer, buffer->pBuffer, buffer->nFilledLen); 6269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) 6271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" [FBD] ERROR in ptr(%p)", buffer); 6273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 6274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (output_flush_progress) 6276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer); 6278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->nFilledLen = 0; 6279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->nTimeStamp = 0; 6280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA; 6281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; 6282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 6283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, buffer->nFilledLen = %lu, buffer->nFlags = 0x%x", 6286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer, buffer->pBuffer, buffer->nFilledLen, buffer->nFlags); 6287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_output_buffers --; 6288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_dqbuf_count++; 6289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buffer->nFlags & OMX_BUFFERFLAG_EOS) 6290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Output EOS has been reached"); 6292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!output_flush_progress) 6293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin post_event((unsigned)NULL, (unsigned)NULL, 6294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EOS_DONE); 6295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (psource_frame) 6297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame); 6299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin psource_frame = NULL; 6300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pdest_frame) 6302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pdest_frame->nFilledLen = 0; 6304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL, 6305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned)NULL); 6306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pdest_frame = NULL; 6307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW(" In fill Buffer done call address %p , buffer->nFilledLen = %lu",buffer, buffer->nFilledLen); 6311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef OUTPUT_BUFFER_LOG 6312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::fill_buffer_done 1.5, output_buffer_write_counter = %d", output_buffer_write_counter); 6313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(outputBufferFile < 0) 6314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Failed to create outputBufferFile \n"); 6316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (outputBufferFile && buffer->nFilledLen && (output_buffer_write_counter <= 10)) 6318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::fill_buffer_done 2"); 6320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int buf_index = buffer - m_out_mem_ptr; 6321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int stride = drv_ctx.video_resolution_output.stride; //w 6322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int scanlines = drv_ctx.video_resolution_output.scan_lines; //h 6323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr; // mmap ION buffer addr 6324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i; 6325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int bytes_written = 0; 6326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (i = 0; i < drv_ctx.video_resolution_output.frame_height; i++) { 6327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytes_written = write(outputBufferFile, temp, drv_ctx.video_resolution_output.frame_width); 6328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp += stride; 6329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines; 6331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int stride_c = stride; 6332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(i = 0; i < drv_ctx.video_resolution_output.frame_height/2; i++) { 6333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytes_written += write(outputBufferFile, temp, drv_ctx.video_resolution_output.frame_width); 6334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin temp += stride_c; 6335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_buffer_write_counter++; 6337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(output_buffer_write_counter > 10) 6339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(outputBufferFile); 6341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::fill_buffer_done 2.9 close "); 6342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 6345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::fill_buffer_done 3"); 6346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_cb.FillBufferDone) 6348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("omx_vdpp::fill_buffer_done 4"); 6350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buffer->nFlags & OMX_BUFFERFLAG_EOS){ 6352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prev_ts = LLONG_MAX; 6353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rst_prev_ts = true; 6354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("omx_vdpp::fill_buffer_done 5 "); 6357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cb.FillBufferDone (hComp,m_app_data, buffer); 6358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" After Fill Buffer Done callback"); 6359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 6364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 6367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6369e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::empty_buffer_done(OMX_HANDLETYPE hComp, 6370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE* buffer) 6371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) 6373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" empty_buffer_done: ERROR bufhdr = %p", buffer); 6375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 6376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", 6379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer, buffer->pBuffer); 6380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_input_buffers--; 6381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_dqbuf_count++; 6382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_cb.EmptyBufferDone) 6384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer->nFilledLen = 0; 6386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (input_use_buffer == true){ 6387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr]; 6388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("!!! empty_buffer_done before callback: buffer = %p\n", buffer); 6390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cb.EmptyBufferDone(hComp ,m_app_data, buffer); 6391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 6393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_vdpp::async_message_process (void *context, void* message) 6396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_vdpp* omx = NULL; 6398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_msginfo *vdpp_msg = NULL; 6399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE* omxhdr = NULL; 6400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_buffer *v4l2_buf_ptr = NULL; 6401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_output_frameinfo *output_respbuf = NULL; 6402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc=1; 6403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("async_message_process 0\n"); 6404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (context == NULL || message == NULL) 6405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" FATAL ERROR in omx_vdpp::async_message_process NULL Check"); 6407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return -1; 6408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("async_message_process 1\n"); 6410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg = (struct vdpp_msginfo *)message; 6411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx = reinterpret_cast<omx_vdpp*>(context); 6413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (vdpp_msg->msgcode) 6415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_EVT_HW_ERROR: 6418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 6419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 6420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_RESP_START_DONE: 6423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 6424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_START_DONE); 6425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_RESP_STOP_DONE: 6428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 6429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_STOP_DONE); 6430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_RESP_RESUME_DONE: 6433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 6434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_RESUME_DONE); 6435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_RESP_PAUSE_DONE: 6438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 6439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_PAUSE_DONE); 6440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_RESP_FLUSH_INPUT_DONE: 6443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 6444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH); 6445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_RESP_FLUSH_OUTPUT_DONE: 6447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned)NULL, vdpp_msg->status_code,\ 6448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH); 6449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_RESP_INPUT_FLUSHED: 6451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_RESP_INPUT_BUFFER_DONE: 6452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW(" VDPP_MSG_RESP_INPUT_BUFFER_DONE 0"); 6453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf_ptr = (v4l2_buffer*)vdpp_msg->msgdata.input_frame_clientdata; 6454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Use v4l2_buf_ptr->index returned by VPU V4L2 driver to index into 6455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // m_inp_mem_ptr. v4l2 driver right now returns the same index used in QBUF 6456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // In the future the returned ION handle could be used in empty_buffer_done. 6457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index; 6458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" VDPP_MSG_RESP_INPUT_BUFFER_DONE 1 v4l2_buf_ptr->index = %d", v4l2_buf_ptr->index); 6459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omxhdr == NULL || 6460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) 6461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_ERROR(" VDPP_MSG_RESP_INPUT_BUFFER_DONE 2"); 6463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr = NULL; 6464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg->status_code = VDPP_S_EFATAL; 6465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW(" VDPP_MSG_RESP_INPUT_BUFFER_DONE 3"); 6467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // No need to update the omxhdr->nFilledLen using the plane[0].len + plane[1].len here. 6468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // based on OMX 3.1.2.9.2, nFilledLen = 0 if input buffer is completely consumed in ebd. 6469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // also refer to ebd code 6470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned int)omxhdr,vdpp_msg->status_code, 6471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EBD); 6472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_RESP_OUTPUT_FLUSHED: 6474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_RESP_OUTPUT_BUFFER_DONE: 6475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_buf_ptr = (v4l2_buffer*)vdpp_msg->msgdata.output_frame.client_data; 6477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index; 6478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("VDPP_MSG_RESP_OUTPUT_BUFFER_DONE 1 v4l2_buf_ptr->index = %d\n", v4l2_buf_ptr->index); 6479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omxhdr && omxhdr->pOutputPortPrivate && 6481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) && 6482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (((struct vdpp_output_frameinfo *)omxhdr->pOutputPortPrivate 6483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) 6484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ( vdpp_msg->msgdata.output_frame.len <= omxhdr->nAllocLen) 6486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //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); 6488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr->nFilledLen = vdpp_msg->msgdata.output_frame.len; 6489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr->nOffset = vdpp_msg->msgdata.output_frame.offset; 6490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr->nTimeStamp = vdpp_msg->msgdata.output_frame.time_stamp; 6491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags; 6492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //DEBUG_PRINT_LOW("VDPP_MSG_RESP_OUTPUT_BUFFER_DONE 2.5 omxhdr->nFilledLen = %ld\n", omxhdr->nFilledLen); 6494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) 6495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr->nFlags |= OMX_BUFFERFLAG_EOS; 6497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //rc = -1; 6498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // use mmaped ION buffer address 6501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg->msgdata.output_frame.bufferaddr = 6502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr; 6503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_respbuf = (struct vdpp_output_frameinfo *)\ 6505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr->pOutputPortPrivate; 6506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_respbuf->len = vdpp_msg->msgdata.output_frame.len; 6507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_respbuf->offset = vdpp_msg->msgdata.output_frame.offset; 6508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (omx->output_use_buffer) 6510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy ( omxhdr->pBuffer, (void *) 6511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((unsigned long)vdpp_msg->msgdata.output_frame.bufferaddr + 6512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long)vdpp_msg->msgdata.output_frame.offset), 6513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg->msgdata.output_frame.len); 6514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omxhdr->nFilledLen = 0; 6517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //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); 6519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned int)omxhdr, vdpp_msg->status_code, 6521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_FBD); 6522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (vdpp_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) 6524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned int)NULL, vdpp_msg->status_code, 6525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_EOS_DONE); 6526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned int)NULL, vdpp_msg->status_code, 6528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_HARDWARE_ERROR); 6529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_EVT_CONFIG_CHANGED: 6531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Port settings changed"); 6532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition, 6533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_PORT_RECONFIG); 6534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case VDPP_MSG_EVT_ACTIVE_REGION_DETECTION_STATUS: 6536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_rect * p_ar_result = &(vdpp_msg->msgdata.ar_result); 6538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Active Region Detection Status"); 6539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx->post_event ((unsigned int)p_ar_result, 6540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin vdpp_msg->status_code, 6541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMPONENT_GENERATE_ACTIVE_REGION_DETECTION_STATUS); 6542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 6545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 6546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 6550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef USE_ION 6553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdpp::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 6554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 alignment) 6555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct pmem_allocation allocation; 6557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin allocation.size = buffer_size; 6558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin allocation.align = clip2(alignment); 6559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (allocation.align < 4096) 6560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin allocation.align = 4096; 6562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) 6564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" Aligment(%u) failed with pmem driver Sz(%lu)", 6566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin allocation.align, allocation.size); 6567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return false; 6568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return true; 6570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 6572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 6573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_vdpp::alloc_map_ion_memory(OMX_U32 buffer_size, 6574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 alignment, struct ion_allocation_data *alloc_data, 6575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct ion_fd_data *fd_data, int flag) 6576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int fd = -EINVAL; 6578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc = -EINVAL; 6579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int ion_dev_flag; 6580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdpp_ion ion_buf_info; 6581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!alloc_data || buffer_size <= 0 || !fd_data) { 6582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n"); 6583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return -EINVAL; 6584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_dev_flag = (O_RDONLY | O_DSYNC); 6586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fd = open (MEM_DEVICE, ion_dev_flag); 6587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (fd < 0) { 6588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd); 6589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return fd; 6590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin alloc_data->len = buffer_size; 6593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // the following settings are from vpu_test.c 6595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin alloc_data->align = 16; 6596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID); 6597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin alloc_data->flags = 0; 6598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(fd,ION_IOC_ALLOC,alloc_data); 6600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc || !alloc_data->handle) { 6601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" ION ALLOC memory failed "); 6602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin alloc_data->handle = NULL; 6603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(fd); 6604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fd = -ENOMEM; 6605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return fd; 6606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fd_data->handle = alloc_data->handle; 6608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(fd,ION_IOC_MAP,fd_data); 6609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc) { 6610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" ION MAP failed "); 6611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_buf_info.ion_alloc_data = *alloc_data; 6612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_buf_info.ion_device_fd = fd; 6613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_buf_info.fd_ion_data = *fd_data; 6614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free_ion_memory(&ion_buf_info); 6615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fd_data->fd =-1; 6616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(fd); 6617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fd = -ENOMEM; 6618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return fd; 6621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdpp::free_ion_memory(struct vdpp_ion *buf_ion_info) { 6624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!buf_ion_info) { 6626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" ION: free called with invalid fd/allocdata"); 6627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return; 6628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE, 6630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &buf_ion_info->ion_alloc_data.handle)) { 6631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR(" ION: free failed" ); 6632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(buf_ion_info->ion_device_fd); 6634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_ion_info->ion_device_fd = -1; 6635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_ion_info->ion_alloc_data.handle = NULL; 6636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_ion_info->fd_ion_data.fd = -1; 6637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 6639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdpp::free_output_buffer_header() 6640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" ALL output buffers are freed/released"); 6642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin output_use_buffer = false; 6643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ouput_egl_buffers = false; 6644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_out_mem_ptr) 6646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free (m_out_mem_ptr); 6648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_mem_ptr = NULL; 6649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_platform_list) 6652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(m_platform_list); 6654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_platform_list = NULL; 6655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ptr_respbuffer) 6658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free (drv_ctx.ptr_respbuffer); 6660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_respbuffer = NULL; 6661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ptr_outputbuffer) 6663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free (drv_ctx.ptr_outputbuffer); 6665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer = NULL; 6666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 6668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.op_buf_ion_info) { 6669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free o/p ion context"); 6670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(drv_ctx.op_buf_ion_info); 6671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf_ion_info = NULL; 6672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 6674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdpp::free_input_buffer_header() 6677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin input_use_buffer = false; 6679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_inp_heap_ptr) 6681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free input Heap Pointer"); 6683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free (m_inp_heap_ptr); 6684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_heap_ptr = NULL; 6685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_phdr_pmem_ptr) 6688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free input pmem header Pointer"); 6690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free (m_phdr_pmem_ptr); 6691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_phdr_pmem_ptr = NULL; 6692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_inp_mem_ptr) 6695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free input pmem Pointer area"); 6697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free (m_inp_mem_ptr); 6698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_inp_mem_ptr = NULL; 6699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ptr_inputbuffer) 6702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free Driver Context pointer"); 6704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free (drv_ctx.ptr_inputbuffer); 6705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_inputbuffer = NULL; 6706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 6708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.ip_buf_ion_info) { 6709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free ion context"); 6710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(drv_ctx.ip_buf_ion_info); 6711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ip_buf_ion_info = NULL; 6712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 6714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_vdpp::stream_off(OMX_U32 port) 6717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin enum v4l2_buf_type btype; 6719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc = 0; 6720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin enum v4l2_ports v4l2_port = OUTPUT_PORT; 6721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (port == OMX_CORE_INPUT_PORT_INDEX) { 6723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 6724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_port = OUTPUT_PORT; 6725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) { 6726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 6727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin v4l2_port = CAPTURE_PORT; 6728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (port == OMX_ALL) { 6729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX); 6730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX); 6731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!rc_input) 6733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc_input; 6734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc_output; 6736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!streaming[v4l2_port]) { 6739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // already streamed off, warn and move on 6740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port," 6741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " which is already streamed off", v4l2_port); 6742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return 0; 6743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port); 6746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef STUB_VPU 6747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(drv_ctx.video_vpu_fd, VIDIOC_STREAMOFF, &btype); 6748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc) { 6749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port \n", v4l2_port); 6750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 6751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin streaming[v4l2_port] = false; 6752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 6754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return rc; 6756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// return buffer_prop->actualcount and buffer_prop->buffer_size 6759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// based on ip/op format 6760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef STUB_VPU 6761e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::get_buffer_req(vdpp_allocatorproperty *buffer_prop) 6762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 6764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_requestbuffers bufreq; 6765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0; 6766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_format fmt; 6767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int ret = 0; 6769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("omx_vdpp::get_buffer_req GetBufReq IN: ActCnt(%d) Size(%d)", 6771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount, buffer_prop->buffer_size); 6772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT){ 6774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.count = VP_INPUT_BUFFER_COUNT_INTERLACE; 6776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin }else if (buffer_prop->buffer_type == VDPP_BUFFER_TYPE_OUTPUT){ 6777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.count = VP_OUTPUT_BUFFER_COUNT; 6779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin }else 6780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("omx_vdpp:: wrong buffer type"); 6782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount = bufreq.count; 6786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->mincount = bufreq.count; 6787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Count = %d \n ",bufreq.count); 6788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d)", 6791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount, buffer_prop->buffer_size); 6792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->buffer_size = drv_ctx.video_resolution_input.frame_height * 6794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin paddedFrameWidth128(drv_ctx.video_resolution_input.frame_width) * 6795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3 / 2; // hardcoded size for stub NV12 6796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_size = buffer_prop->buffer_size; 6798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 6800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)", 6801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount, buffer_prop->buffer_size, buf_size); 6802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (in_reconfig) // BufReq will be set to driver when port is disabled 6803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->buffer_size = buf_size; 6804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (buf_size != buffer_prop->buffer_size) 6805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->buffer_size = buf_size; 6807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = set_buffer_req(buffer_prop); 6808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //} 6810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d)", 6811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount, buffer_prop->buffer_size); 6812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 6813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// set buffer_prop->actualcount through VIDIOC_REQBUFS 6816e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::set_buffer_req(vdpp_allocatorproperty *buffer_prop) 6817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 6819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned buf_size = 0; 6820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_format fmt; 6821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_requestbuffers bufreq; 6822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int ret; 6823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("omx_vdpp::set_buffer_req SetBufReq IN: ActCnt(%d) Size(%d)", 6824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount, buffer_prop->buffer_size); 6825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 6826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buf_size != buffer_prop->buffer_size) 6827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)", 6829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->buffer_size, buf_size); 6830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 6831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 6834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 6835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else 6836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// call VIDIOC_REQBUFS to set the initial number of buffers that app wants to 6837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// use in streaming 6838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// return buffer_prop->buffer_size and ip/op resolution based on ip/op format 6839e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::get_buffer_req(vdpp_allocatorproperty *buffer_prop) 6840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 6841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 6842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_requestbuffers bufreq; 6843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0; 6844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_format fmt; 6845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int ret = 0; 6846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset((void *)&fmt, 0, sizeof(v4l2_format)); 6848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset((void *)&bufreq, 0, sizeof(v4l2_requestbuffers)); 6849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("GetBufReq IN: ActCnt(%d) Size(%d) buffer_prop->buffer_type (%d), streaming[OUTPUT_PORT] (%d), streaming[CAPTURE_PORT] (%d)", 6850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type, streaming[OUTPUT_PORT], streaming[CAPTURE_PORT]); 6851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.memory = V4L2_MEMORY_USERPTR; 6852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT){ 6853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 6854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 6855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = output_capability; 6856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.count = VP_INPUT_BUFFER_COUNT_INTERLACE; 6857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin }else if (buffer_prop->buffer_type == VDPP_BUFFER_TYPE_OUTPUT){ 6858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 6859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 6860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = capture_capability; 6861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.count = VP_OUTPUT_BUFFER_COUNT; 6862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin }else {eRet = OMX_ErrorBadParameter;} 6863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(eRet==OMX_ErrorNone){ 6864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd,VIDIOC_REQBUFS, &bufreq); 6865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ret) 6867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("GetBufReq Requesting buffer requirements failed 1"); 6869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 6870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 6871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount = bufreq.count; 6875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->mincount = bufreq.count; 6876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Count = %d \n ",bufreq.count); 6877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%d), buffer_prop->buffer_type(%d) fmt.fmt.pix_mp.pixelformat (0x%08x)", 6879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type, fmt.fmt.pix_mp.pixelformat); 6880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT) 6882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height = drv_ctx.video_resolution_input.frame_height; 6884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width = drv_ctx.video_resolution_input.frame_width; 6885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (V4L2_FIELD_NONE == drv_ctx.interlace) 6886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 6888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_INTERLACED; 6892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height = drv_ctx.video_resolution_output.frame_height; 6898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width = drv_ctx.video_resolution_output.frame_width; 6899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 6900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_G_FMT, &fmt); 6903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // S_FMT is always called before get_buffer_req 6904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // we should be able to use G_FMT to get fmt info. 6905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_TRY_FMT, &fmt); 6906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_G_FMT, &fmt); 6907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT) 6909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.input_num_planes = fmt.fmt.pix_mp.num_planes; 6911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.frame_height = fmt.fmt.pix_mp.height; 6912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.frame_width = fmt.fmt.pix_mp.width; 6913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("GetBufReq drv_ctx.video_resolution_input.frame_height = %d, drv_ctx.video_resolution_input.frame_width = %d ", 6914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_input.frame_height, drv_ctx.video_resolution_input.frame_width); 6915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_num_planes = fmt.fmt.pix_mp.num_planes; 6919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_height = fmt.fmt.pix_mp.height; 6920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_width = fmt.fmt.pix_mp.width; 6921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("GetBufReq drv_ctx.video_resolution_output.frame_height = %d, drv_ctx.video_resolution_output.frame_width = %d ", 6922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.video_resolution_output.frame_height, drv_ctx.video_resolution_output.frame_width); 6923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->frame_size = paddedFrameWidth32(fmt.fmt.pix_mp.height) * 6926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin paddedFrameWidth128(fmt.fmt.pix_mp.width) * 6927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3 / 2; 6928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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", 6929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.num_planes, fmt.fmt.pix_mp.height, fmt.fmt.pix_mp.width, buffer_prop->frame_size); 6930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ret) 6933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("GetBufReq Requesting buffer requirements failed 2"); 6935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 6936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int extra_idx = 0; 6940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 6941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_size = buffer_prop->buffer_size; 6942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT) 6943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extra_idx = EXTRADATA_IDX(drv_ctx.input_num_planes); 6945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 6947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extra_idx = EXTRADATA_IDX(drv_ctx.output_num_planes); 6949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((extra_idx > 0) && (extra_idx < VIDEO_MAX_PLANES)) { 6952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage; 6953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("omx_vdpp::get_buffer_req extra_data_size: %d\n", extra_data_size); 6954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (extra_idx >= VIDEO_MAX_PLANES) { 6955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx); 6956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 6957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (client_extradata & OMX_FRAMEINFO_EXTRADATA) 6959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Frame info extra data enabled!"); 6961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE; 6962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (client_extradata & OMX_INTERLACE_EXTRADATA) 6964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Interlace extra data enabled!"); 6966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE; 6967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (client_extradata & OMX_PORTDEF_EXTRADATA) 6969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE; 6971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n", 6972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extra_data_size); 6973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (client_extra_data_size) 6975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator 6977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit 6978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // update buffer_prop->buffer_size to include plane 1 buffer size 6980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // so only 1 ION buffer will be allocated for each input/output buffer 6981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (extra_data_size > 0) 6982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_size += extra_data_size; 6984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 6985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 6986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size; 6987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.extradata_info.count = buffer_prop->actualcount; 6988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.extradata_info.buffer_size = extra_data_size; 6989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_size += client_extra_data_size; // client_extra_data_size defaults to 0 6990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 6991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d)", 6992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount, buffer_prop->buffer_size, buf_size); 6993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (in_reconfig) // BufReq will be set to driver when port is disabled 6994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->buffer_size = buf_size; 6995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (buf_size != buffer_prop->buffer_size) 6996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 6997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->buffer_size = buf_size; 6998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = set_buffer_req(buffer_prop); 6999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%d) buffer_prop->buffer_type(%d)", 7002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type); 7003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 7004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 7005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// set buffer_prop->actualcount through VIDIOC_REQBUFS 7007e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::set_buffer_req(vdpp_allocatorproperty *buffer_prop) 7008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 7009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 7010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned buf_size = 0; 7011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i = 0; 7012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_format fmt; 7013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_requestbuffers bufreq; 7014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int ret; 7015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)", 7016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount, buffer_prop->buffer_size); 7017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset((void *)&fmt, 0, sizeof(v4l2_format)); 7018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset((void *)&bufreq, 0, sizeof(v4l2_requestbuffers)); 7019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1)); 7020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buf_size != buffer_prop->buffer_size) 7021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)", 7023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->buffer_size, buf_size); 7024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadParameter; 7025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 7027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT){ 7030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 7031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = output_capability; 7032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (V4L2_FIELD_NONE == drv_ctx.interlace) 7034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 7036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 7038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_INTERLACED; 7040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height = drv_ctx.video_resolution_input.frame_height; 7042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width = drv_ctx.video_resolution_input.frame_width; 7043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin setFormatParams(output_capability, drv_ctx.input_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 7045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 7046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * 7048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.input_bytesperpixel[i] * 7049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height); 7050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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 7051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (buffer_prop->buffer_type == VDPP_BUFFER_TYPE_OUTPUT) { 7053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 7054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.pixelformat = capture_capability; 7055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 7056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height = drv_ctx.video_resolution_output.frame_height; 7057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.width = drv_ctx.video_resolution_output.frame_width; 7058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin setFormatParams(capture_capability, drv_ctx.output_bytesperpixel, &(fmt.fmt.pix_mp.num_planes)); 7060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for( i=0; i<fmt.fmt.pix_mp.num_planes; i++ ) 7061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[i].sizeimage = paddedFrameWidth128(fmt.fmt.pix_mp.width * 7063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.output_bytesperpixel[i] * 7064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.height); 7065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fmt.fmt.pix_mp.plane_fmt[i].bytesperline = paddedFrameWidth128(fmt.fmt.pix_mp.width * drv_ctx.output_bytesperpixel[0]); 7066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 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); 7067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else {eRet = OMX_ErrorBadParameter;} 7069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_FMT, &fmt); 7071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret) 7072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret); 7074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 7075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 7077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("set_buffer_req drv_ctx.interlace = %d", drv_ctx.interlace); 7079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.memory = V4L2_MEMORY_USERPTR; 7082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.count = buffer_prop->actualcount; 7083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(buffer_prop->buffer_type == VDPP_BUFFER_TYPE_INPUT) { 7084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 7085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (buffer_prop->buffer_type == VDPP_BUFFER_TYPE_OUTPUT) { 7086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 7087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else {eRet = OMX_ErrorBadParameter;} 7088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (eRet==OMX_ErrorNone) { 7090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ret = ioctl(drv_ctx.video_vpu_fd,VIDIOC_REQBUFS, &bufreq); 7091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ret) 7094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret); 7096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 7097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else if (bufreq.count < buffer_prop->actualcount) { 7098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Driver refused to change the number of buffers" 7099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin " on v4l2 port %d to %d (prefers %d)", bufreq.type, 7100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_prop->actualcount, bufreq.count); 7101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 7102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 7106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 7107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 7108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7109e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn) 7110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 7111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 7112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!portDefn) 7113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 7115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("omx_vdpp::update_portdef\n"); 7117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->nVersion.nVersion = OMX_SPEC_VERSION; 7118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->nSize = sizeof(portDefn); 7119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->eDomain = OMX_PortDomainVideo; 7120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.frame_rate.fps_denominator > 0) 7121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator / 7122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_denominator; 7123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else { 7124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Error: Divide by zero \n"); 7125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorBadParameter; 7126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (OMX_CORE_INPUT_PORT_INDEX == portDefn->nPortIndex) 7128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->eDir = OMX_DirInput; 7130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount; 7131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->nBufferCountMin = drv_ctx.ip_buf.mincount; 7132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->nBufferSize = drv_ctx.ip_buf.buffer_size; 7133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;//OMX_COLOR_FormatYUV420Planar;//OMX_COLOR_FormatUnused; 7134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 7135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->bEnabled = m_inp_bEnabled; 7136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->bPopulated = m_inp_bPopulated; 7137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameHeight = drv_ctx.video_resolution_input.frame_height; 7138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameWidth = drv_ctx.video_resolution_input.frame_width; 7139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nStride = drv_ctx.video_resolution_input.stride; 7140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nSliceHeight = drv_ctx.video_resolution_input.scan_lines; 7141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (OMX_CORE_OUTPUT_PORT_INDEX == portDefn->nPortIndex) 7143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->eDir = OMX_DirOutput; 7145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount; 7146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->nBufferCountMin = drv_ctx.op_buf.mincount; 7147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->nBufferSize = drv_ctx.op_buf.buffer_size; 7148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 7149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->bEnabled = m_out_bEnabled; 7150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->bPopulated = m_out_bPopulated; 7151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.eColorFormat = (OMX_COLOR_FORMATTYPE) QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 7152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // video_resolution_output.frame_height is retrieved from get_bufreq 7154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameHeight = drv_ctx.video_resolution_output.frame_height; 7155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameWidth = drv_ctx.video_resolution_output.frame_width; 7156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nStride = drv_ctx.video_resolution_output.stride; 7157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nSliceHeight = drv_ctx.video_resolution_output.scan_lines; 7158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 7160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->eDir = OMX_DirMax; 7162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d", 7163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (int)portDefn->nPortIndex); 7164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorBadPortIndex; 7165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH("update_portdef for %lu Width = %lu Height = %lu Stride = %ld SliceHeight = %lu portDefn->format.video.eColorFormat = %d \n", portDefn->nPortIndex, 7168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameWidth, 7169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nFrameHeight, 7170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nStride, 7171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.nSliceHeight, 7172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin portDefn->format.video.eColorFormat); 7173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 7174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 7176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7177e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::allocate_output_headers() 7178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 7179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE eRet = OMX_ErrorNone; 7180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *bufHdr = NULL; 7181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned i= 0; 7182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!m_out_mem_ptr) { 7184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_HIGH(" Use o/p buffer case - Header List allocation"); 7185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int nBufHdrSize = 0; 7186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int nPlatformEntrySize = 0; 7187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int nPlatformListSize = 0; 7188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int nPMEMInfoSize = 0; 7189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_PLATFORM_PRIVATE_LIST *pPlatformList; 7190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_PLATFORM_PRIVATE_ENTRY *pPlatformEntry; 7191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo; 7192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n", 7194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.actualcount); 7195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin nBufHdrSize = drv_ctx.op_buf.actualcount * 7196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(OMX_BUFFERHEADERTYPE); 7197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d \n",nBufHdrSize, 7199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(OMX_BUFFERHEADERTYPE)); 7200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 7202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer = (struct vdpp_bufferpayload *) \ 7204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc (sizeof(struct vdpp_bufferpayload), 7205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.actualcount); 7206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_respbuffer = (struct vdpp_output_frameinfo *)\ 7207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc (sizeof (struct vdpp_output_frameinfo), 7208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf.actualcount); 7209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 7210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf_ion_info = (struct vdpp_ion * ) \ 7211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc (sizeof(struct vdpp_ion),drv_ctx.op_buf.actualcount); 7212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!drv_ctx.op_buf_ion_info) { 7214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info"); 7215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorInsufficientResources; 7216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 7218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_out_mem_ptr && drv_ctx.ptr_outputbuffer 7220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin && drv_ctx.ptr_respbuffer) 7221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr = m_out_mem_ptr; 7223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr); 7224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for(i=0; i < drv_ctx.op_buf.actualcount ; i++) 7226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 7228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 7229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Set the values when we determine the right HxW param 7230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->nAllocLen = 0; 7231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->nFilledLen = 0; 7232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->pAppPrivate = NULL; 7233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX; 7234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->pBuffer = NULL; // since no buffer is allocated 7235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer[i].pmem_fd = -1; 7237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 7238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf_ion_info[i].ion_device_fd =-1; 7239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 7240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*Create a mapping between buffers*/ 7241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i]; 7242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_respbuffer[i].client_data = (void *) \ 7243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &drv_ctx.ptr_outputbuffer[i]; 7244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Move the buffer and buffer header pointers 7245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufHdr++; 7246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 7249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p]\n",\ 7251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_mem_ptr); 7252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_out_mem_ptr) 7253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(m_out_mem_ptr); 7255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_out_mem_ptr = NULL; 7256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.ptr_outputbuffer) 7259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(drv_ctx.ptr_outputbuffer); 7261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_outputbuffer = NULL; 7262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(drv_ctx.ptr_respbuffer) 7264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(drv_ctx.ptr_respbuffer); 7266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.ptr_respbuffer = NULL; 7267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION 7269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (drv_ctx.op_buf_ion_info) { 7270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW(" Free o/p ion context"); 7271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(drv_ctx.op_buf_ion_info); 7272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.op_buf_ion_info = NULL; 7273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 7275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 7276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } else { 7278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin eRet = OMX_ErrorInsufficientResources; 7279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return eRet; 7281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 7282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdpp::complete_pending_buffer_done_cbs() 7284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 7285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p1; 7286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned p2; 7287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned ident; 7288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_cmd_queue tmp_q, pending_bd_q; 7289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_lock(&m_lock); 7290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // pop all pending GENERATE FDB from ftb queue 7291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (m_ftb_q.m_size) 7292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ftb_q.pop_entry(&p1,&p2,&ident); 7294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ident == OMX_COMPONENT_GENERATE_FBD) 7295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_bd_q.insert_entry(p1,p2,ident); 7297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 7299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin tmp_q.insert_entry(p1,p2,ident); 7301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //return all non GENERATE FDB to ftb queue 7304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while(tmp_q.m_size) 7305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin tmp_q.pop_entry(&p1,&p2,&ident); 7307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ftb_q.insert_entry(p1,p2,ident); 7308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // pop all pending GENERATE EDB from etb queue 7310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (m_etb_q.m_size) 7311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_etb_q.pop_entry(&p1,&p2,&ident); 7313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(ident == OMX_COMPONENT_GENERATE_EBD) 7314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_bd_q.insert_entry(p1,p2,ident); 7316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 7318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin tmp_q.insert_entry(p1,p2,ident); 7320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin //return all non GENERATE FDB to etb queue 7323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while(tmp_q.m_size) 7324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin tmp_q.pop_entry(&p1,&p2,&ident); 7326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_etb_q.insert_entry(p1,p2,ident); 7327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_unlock(&m_lock); 7329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // process all pending buffer dones 7330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while(pending_bd_q.m_size) 7331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pending_bd_q.pop_entry(&p1,&p2,&ident); 7333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch(ident) 7334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_EBD: 7336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) 7337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!\n"); 7339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_report_error (); 7340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COMPONENT_GENERATE_FBD: 7344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) 7345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!\n"); 7347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_report_error (); 7348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 7353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdpp::set_frame_rate(OMX_S64 act_timestamp) 7355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 7356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// No framerate control on 8084 VPU. This API is for 8092. 7357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef FRC_ENABLE 7358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 new_frame_interval = 0; 7359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts 7360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) 7361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin new_frame_interval = (act_timestamp > prev_ts)? 7363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin act_timestamp - prev_ts : 7364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prev_ts - act_timestamp; 7365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (new_frame_interval < frm_int || frm_int == 0) 7366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin frm_int = new_frame_interval; 7368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(frm_int) 7369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_numerator = 1e6; 7371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin drv_ctx.frame_rate.fps_denominator = frm_int; 7372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("set_frame_rate: frm_int(%lu) fps(%f)", 7373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin frm_int, drv_ctx.frame_rate.fps_numerator / 7374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (float)drv_ctx.frame_rate.fps_denominator); 7375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* We need to report the difference between this FBD and the previous FBD 7377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * back to the driver for clock scaling purposes. */ 7378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_outputparm oparm; 7379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*XXX: we're providing timing info as seconds per frame rather than frames 7380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * per second.*/ 7381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; 7382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; 7383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct v4l2_streamparm sparm; 7385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 7386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sparm.parm.output = oparm; 7387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ioctl(drv_ctx.video_vpu_fd, VIDIOC_S_PARM, &sparm)) 7388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \ 7390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin performance might be affected"); 7391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prev_ts = act_timestamp; 7397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif 7398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 7399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdpp::adjust_timestamp(OMX_S64 &act_timestamp) 7401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 7402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rst_prev_ts && VALID_TS(act_timestamp)) 7403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prev_ts = act_timestamp; 7405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rst_prev_ts = false; 7406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (VALID_TS(prev_ts)) 7408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool codec_cond = (drv_ctx.timestamp_adjust)? 7410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)? 7411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)): 7412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (!VALID_TS(act_timestamp) || act_timestamp == prev_ts); 7413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(frm_int > 0 && codec_cond) 7414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp); 7416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin act_timestamp = prev_ts + frm_int; 7417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp); 7418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin prev_ts = act_timestamp; 7419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 7421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin set_frame_rate(act_timestamp); 7422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (frm_int > 0) // In this case the frame rate was set along 7424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { // with the port definition, start ts with 0 7425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin act_timestamp = prev_ts = 0; // and correct if a valid ts is received. 7426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rst_prev_ts = true; 7427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 7429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7430e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdpp::enable_extradata(OMX_U32 requested_extradata, bool enable) 7431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 7432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE ret = OMX_ErrorNone; 7433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(m_state != OMX_StateLoaded) 7434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only"); 7436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorIncorrectStateOperation; 7437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("enable_extradata: actual[%lx] requested[%lx] enable[%d]", 7439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extradata, requested_extradata, enable); 7440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (enable) 7442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extradata |= requested_extradata; 7443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 7444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin client_extradata = client_extradata & ~requested_extradata; 7445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return ret; 7447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 7448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdpp::setFormatParams(int pixelFormat, double bytesperpixel[], unsigned char *planesCount) 7450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 7451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*24 RGB-8-8-8 */ 7452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (pixelFormat) 7453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_RGB24: 7455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *planesCount = 0; 7456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[0] = 3; 7457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*32 ARGB-8-8-8-8 */ 7460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_RGB32: 7461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *planesCount = 0; 7462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[0] = 4; 7463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*32 ARGB-2-10-10-10*/ 7466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_XRGB2: 7467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *planesCount = 0; 7468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[0] = 4; 7469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*24 BGR-8-8-8 */ 7472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_BGR24: 7473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *planesCount = 0; 7474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[0] = 3; 7475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*32 BGRX-8-8-8-8 */ 7478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_BGR32: 7479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *planesCount = 0; 7480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[0] = 4; 7481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*32 XBGR-2-10-10-10*/ 7484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_XBGR2: 7485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *planesCount = 0; 7486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[0] = 4; 7487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*12 YUV 4:2:0 semi-planar*/ 7490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_NV12: 7491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *planesCount = 2; 7492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[0] = 1; 7493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[1] = 0.5; 7494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*12 YVU 4:2:0 semi-planar*/ 7497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_NV21: 7498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *planesCount = 2; 7499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[0] = 1; 7500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[1] = 0.5; 7501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* 16 YUYV 4:2:2 interleaved*/ 7504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_YUYV: 7505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *planesCount = 2; 7506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[0] = 2; 7507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[1] = 0.5; 7508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* 16 YVYU 4:2:2 interleaved*/ 7511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_YVYU: 7512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *planesCount = 1; 7513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[0] = 2; 7514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* 16 VYUY 4:2:2 interleaved*/ 7517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_VYUY: 7518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *planesCount = 1; 7519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[0] = 2; 7520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* 16 UYVY 4:2:2 interleaved*/ 7523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case V4L2_PIX_FMT_UYVY: 7524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *planesCount = 1; 7525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytesperpixel[0] = 2; 7526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 7529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("%s: ERROR: pixel format %d is not supported!\n", 7530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin __func__, pixelFormat); 7531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 7534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 7535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_vdpp::openInput(const char* inputName) 7536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 7537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int fd = -1; 7538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin const char *dirname = "/sys/class/video4linux"; 7539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin char devname[PATH_MAX]; 7540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin char dev[PATH_MAX]; 7541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin char *filename; 7542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DIR *dir; 7543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct dirent *de; 7544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin dir = opendir(dirname); 7545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(dir == NULL) 7546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return -1; 7547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy(dev, dirname, sizeof(dev)); 7548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin filename = dev + strlen(dev); 7549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *filename++ = '/'; 7550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while((de = readdir(dir))) 7551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(de->d_name[0] == '.' && 7553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (de->d_name[1] == '\0' || 7554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (de->d_name[1] == '.' && de->d_name[2] == '\0'))) 7555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin continue; 7556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy(filename, de->d_name, PATH_MAX - sizeof(dev) - 1); 7557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*DEBUG_PRINT_LOW("Filename found: %s\n", filename);*/ 7558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin char name[80]; 7559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int fd_devname; 7560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int result; 7561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy(devname, dev, sizeof(devname)); 7562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcat(devname, "/name", sizeof(devname)); 7563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /*DEBUG_PRINT_LOW("opening name file: %s\n", devname);*/ 7564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* find and read device node names from sys/conf/video4linux dir*/ 7565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fd_devname = open(devname,O_RDONLY); 7566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(fd_devname < 0) 7567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("openInput: could not find device name.\n"); 7568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin result = read(fd_devname, name, strlen(inputName)); 7569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(result < 0) 7570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("openInput: could not read device name.\n"); 7572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 7574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(!strcmp(name, inputName)) 7576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 7577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(fd_devname); 7578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /* open the vpu driver node found from /dev dir */ 7579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin char temp[80]; 7580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy(temp, "/dev/", sizeof(temp)); 7581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcat(temp, filename, sizeof(temp)); 7582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_LOW("openInput: opening device: %s\n", temp); 7583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fd = open(temp, O_RDWR | O_NONBLOCK); 7584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if(fd < 0) 7585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEBUG_PRINT_ERROR("openInput: Error opening device %s\n", temp); 7586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 7587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 7588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(fd_devname); 7591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 7592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin closedir(dir); 7593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ALOGE_IF(fd<0, "couldn't find '%s' input device", inputName); 7594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return fd; 7595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 7596