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