18767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/*--------------------------------------------------------------------------
2e4010605f233a213cf0d972397bb33c34c364227Patrick TjinCopyright (c) 2013-2015, The Linux Foundation. All rights reserved.
38767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
48767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRedistribution and use in source and binary forms, with or without
58767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanmodification, are permitted provided that the following conditions are met:
68767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan* Redistributions of source code must retain the above copyright
78767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavannotice, this list of conditions and the following disclaimer.
88767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan* Redistributions in binary form must reproduce the above copyright
98767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavannotice, this list of conditions and the following disclaimer in the
108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavandocumentation and/or other materials provided with the distribution.
118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan* Neither the name of The Linux Foundation nor
128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanthe names of its contributors may be used to endorse or promote
138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanproducts derived from this software without specific prior written
148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanpermission.
158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan--------------------------------------------------------------------------*/
288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/*============================================================================
308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanO p e n M A X   w r a p p e r s
318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanO p e n  M A X   C o r e
328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan*//** @file omx_vdec.cpp
348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanThis module contains the implementation of the OpenMAX core & component.
358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan*//*========================================================================*/
378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan//////////////////////////////////////////////////////////////////////////////
398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan//                             Include Files
408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan//////////////////////////////////////////////////////////////////////////////
418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <string.h>
438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <pthread.h>
448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <sys/prctl.h>
458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <stdlib.h>
468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <unistd.h>
478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <errno.h>
488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include "omx_vdec_hevc_swvdec.h"
498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <fcntl.h>
508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <limits.h>
518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <stdlib.h>
528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <media/hardware/HardwareAPI.h>
538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <media/msm_media_info.h>
548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifndef _ANDROID_
568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <sys/ioctl.h>
578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <sys/mman.h>
588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif //_ANDROID_
598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <cutils/properties.h>
628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#undef USE_EGL_IMAGE_GPU
638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <qdMetaData.h>
668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_EGL_IMAGE_GPU
688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <EGL/egl.h>
698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <EGL/eglQCOM.h>
708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define EGL_BUFFER_HANDLE_QCOM 0x4F00
718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define EGL_BUFFER_OFFSET_QCOM 0x4F01
728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define BUFFER_LOG_LOC "/data/misc/media"
758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef OUTPUT_EXTRADATA_LOG
778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFILE *outputExtradataFile;
788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanchar ouputextradatafilename [] = "/data/extradata";
798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEFAULT_FPS 30
828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define MAX_INPUT_ERROR DEFAULT_FPS
838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define MAX_SUPPORTED_FPS 120
848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEFAULT_WIDTH_ALIGNMENT 128
858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEFAULT_HEIGHT_ALIGNMENT 32
868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_SP_MP_START_CODE        0xC5000000
888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_SP_MP_START_CODE_MASK   0xFF000000
898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_AP_SEQ_START_CODE       0x0F010000
908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_STRUCT_C_PROFILE_MASK   0xF0
918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000
928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_SIMPLE_PROFILE          0
938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_MAIN_PROFILE            1
948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_ADVANCE_PROFILE         3
958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0
968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_SIMPLE_PROFILE_MED_LEVEL  2
978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_STRUCT_C_LEN            4
988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_STRUCT_C_POS            8
998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_STRUCT_A_POS            12
1008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_STRUCT_B_POS            24
1018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define VC1_SEQ_LAYER_SIZE          36
1028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define POLL_TIMEOUT 0x7fffffff
1038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define MEM_DEVICE "/dev/ion"
1058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
1068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
1088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanextern "C"{
1098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include<utils/Log.h>
1108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
1118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif//_ANDROID_
1128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define SZ_4K 0x1000
1148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define SZ_1M 0x100000
1158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
1178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define EXTRADATA_IDX(__num_planes) ((__num_planes) ? (__num_planes) - 1 : 0)
1198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA)
1218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstatic OMX_U32 maxSmoothStreamingWidth = 1920;
1238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstatic OMX_U32 maxSmoothStreamingHeight = 1088;
1248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid* async_message_thread (void *input)
1258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
1268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer;
1278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
1288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct pollfd pfd;
1298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_buffer v4l2_buf;
1308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
1318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_event dqevent;
1328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
1338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
1348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pfd.fd = omx->drv_ctx.video_driver_fd;
1358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
1368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: Async thread start");
1378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
1388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while (1)
1398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
1408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rc = poll(&pfd, 1, POLL_TIMEOUT);
1418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!rc) {
1428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Poll timedout");
1438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
1448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if (rc < 0) {
1458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error while polling: %d", rc);
1468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
1478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
1488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
1498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            struct vdec_msginfo vdec_msg;
150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            memset(&vdec_msg, 0, sizeof(vdec_msg));
1518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
1538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            v4l2_buf.length = omx->drv_ctx.num_planes;
1548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            v4l2_buf.m.planes = plane;
1558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
1568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
1578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
1588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
1598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
1608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
1618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
1628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (uint64_t)v4l2_buf.timestamp.tv_usec;
1638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (vdec_msg.msgdata.output_frame.len) {
1648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
1658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
1668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
1678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
1688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
1698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
1708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
1718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    break;
1728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
1738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
1748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
1758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
1768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            struct vdec_msginfo vdec_msg;
1778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
1798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            v4l2_buf.length = 1;
1808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            v4l2_buf.m.planes = plane;
1818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            while(!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
1828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
1838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
1848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
1858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
1868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
1878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    break;
1888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
1898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
1908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
1918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pfd.revents & POLLPRI){
1928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
1938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
1948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                struct vdec_msginfo vdec_msg;
1958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
1968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
1978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved insufficient");
1988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
1998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
2008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    break;
2018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
2028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
2038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                struct vdec_msginfo vdec_msg;
2048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
2058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved ");
2078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
2098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    break;
2108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
2118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
2128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved ");
2148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
2168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    break;
2178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
2188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
2198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Close Done Recieved and async_message_thread Exited");
2208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
2218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else if(dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
2228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                struct vdec_msginfo vdec_msg;
2238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR;
2248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("SYS Error Recieved");
2268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
2288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    break;
2298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
2308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE) {
231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                unsigned char *tmp = dqevent.u.data;
232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                unsigned int *ptr = (unsigned int *)tmp;
2338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("REFERENCE RELEASE EVENT RECVD fd = %d offset = %d", ptr[0], ptr[1]);
2348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                omx->buf_ref_remove(ptr[0], ptr[1]);
2358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER) {
236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                unsigned char *tmp = dqevent.u.data;
237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                unsigned int *ptr = (unsigned int *)tmp;
238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                struct vdec_msginfo vdec_msg;
2408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Release unqueued buffer event recvd fd = %d offset = %d", ptr[0], ptr[1]);
2428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
2448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                v4l2_buf.memory = V4L2_MEMORY_USERPTR;
2458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                v4l2_buf.length = omx->drv_ctx.num_planes;
2468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                v4l2_buf.m.planes = plane;
2478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                v4l2_buf.index = ptr[5];
2488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                v4l2_buf.flags = 0;
2498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgcode = VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
2518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.status_code = VDEC_S_SUCCESS;
2528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgdata.output_frame.client_data = (void*)&v4l2_buf;
2538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgdata.output_frame.len = 0;
254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                vdec_msg.msgdata.output_frame.bufferaddr = (void*)(intptr_t)ptr[2];
2558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgdata.output_frame.time_stamp = ((uint64_t)ptr[3] * (uint64_t)1000000) +
2568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (uint64_t)ptr[4];
2578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited  ");
2598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    break;
2608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
2618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
2628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Some Event recieved");
2638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                continue;
2648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
2658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
2678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop");
2688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return NULL;
2698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
2708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid* message_thread(void *input)
2728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
2738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
2748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned char id;
2758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int n;
2768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (omx == NULL)
2778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
2788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("message thread null pointer rxd");
2798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return NULL;
2808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
2818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: message thread start");
2838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
2848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while (1)
2858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
2868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        n = read(omx->m_pipe_in, &id, 1);
2888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(0 == n)
2908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
2918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
2928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (1 == n)
2958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
2968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            omx->process_event_cb(omx, id);
2978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ((n < 0) && (errno != EINTR))
2998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
3008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: read from pipe failed, ret %d errno %d", n, errno);
3018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
3028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
3038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
3048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: message thread stop");
3058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return NULL;
3068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
3078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
3088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid post_message(omx_vdec *omx, unsigned char id)
3098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
3108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int ret_value;
3118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
3128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (omx == NULL)
3138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
3148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("message thread null pointer rxd");
3158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
3168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
3178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out);
3188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    ret_value = write(omx->m_pipe_out, &id, 1);
3198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value);
3208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
3218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
3228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan// omx_cmd_queue destructor
3238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::omx_cmd_queue::~omx_cmd_queue()
3248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
3258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    // Nothing to do
3268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
3278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
3288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan// omx cmd queue constructor
3298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
3308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
3318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(m_q,0,sizeof(m_q));
3328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
3338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
3348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan// omx cmd queue insert
335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdec::omx_cmd_queue::insert_entry(unsigned long p1, unsigned long p2, unsigned long id)
3368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
3378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool ret = true;
3388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_size < OMX_CORE_CONTROL_CMDQ_SIZE)
3398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
3408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_q[m_write].id       = id;
3418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_q[m_write].param1   = p1;
3428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_q[m_write].param2   = p2;
3438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_write++;
3448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_size ++;
3458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_write >= OMX_CORE_CONTROL_CMDQ_SIZE)
3468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
3478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_write = 0;
3488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
3498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
3508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
3518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
3528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = false;
3538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__);
3548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
3558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return ret;
3568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
3578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
3588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan// omx cmd queue pop
359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdec::omx_cmd_queue::pop_entry(unsigned long *p1, unsigned long *p2, unsigned long*id)
3608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
3618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool ret = true;
3628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_size > 0)
3638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
3648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *id = m_q[m_read].id;
3658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *p1 = m_q[m_read].param1;
3668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *p2 = m_q[m_read].param2;
3678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // Move the read pointer ahead
3688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ++m_read;
3698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        --m_size;
3708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_read >= OMX_CORE_CONTROL_CMDQ_SIZE)
3718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
3728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_read = 0;
3738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
3748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
3758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
3768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
3778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = false;
3788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
3798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return ret;
3808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
3818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
3828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan// Retrieve the first mesg type in the queue
3838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
3848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
3858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return m_q[m_read].id;
3868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
3878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
3888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
3898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::ts_arr_list::ts_arr_list()
3908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
3918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //initialize timestamps array
3928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(m_ts_arr_list, 0, sizeof(m_ts_arr_list) );
3938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
3948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::ts_arr_list::~ts_arr_list()
3958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
3968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //free m_ts_arr_list?
3978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
3988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
3998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
4008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
4018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool ret = true;
4028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool duplicate_ts = false;
4038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int idx = 0;
4048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //insert at the first available empty location
4068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
4078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
4088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_ts_arr_list[idx].valid)
4098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
4108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            //found invalid or empty entry, save timestamp
4118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_ts_arr_list[idx].valid = true;
4128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_ts_arr_list[idx].timestamp = ts;
4138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
4148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                ts, idx);
4158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
4168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
4178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
4188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS)
4208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
4218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
4228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = false;
4238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
4248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return ret;
4258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
4268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
4288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
4298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool ret = true;
4308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int min_idx = -1;
4318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_TICKS min_ts = 0;
4328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int idx = 0;
4338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
4358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
4368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_ts_arr_list[idx].valid)
4388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
4398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            //found valid entry, save index
4408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (min_idx < 0)
4418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
4428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                //first valid entry
4438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                min_ts = m_ts_arr_list[idx].timestamp;
4448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                min_idx = idx;
4458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
4468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if (m_ts_arr_list[idx].timestamp < min_ts)
4478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
4488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                min_ts = m_ts_arr_list[idx].timestamp;
4498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                min_idx = idx;
4508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
4518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
4528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
4548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (min_idx < 0)
4568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
4578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        //no valid entries found
4588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
4598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ts = 0;
4608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = false;
4618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
4628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
4638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
4648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ts = m_ts_arr_list[min_idx].timestamp;
4658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_ts_arr_list[min_idx].valid = false;
4668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
4678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ts, min_idx);
4688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
4698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return ret;
4718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
4738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::ts_arr_list::reset_ts_list()
4768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
4778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool ret = true;
4788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int idx = 0;
4798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
4818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++)
4828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
4838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_ts_arr_list[idx].valid = false;
4848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
4858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return ret;
4868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
4878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
4888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan// factory function executed by the core to create instances
4908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid *get_omx_component_factory_fn(void)
4918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
4928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return (new omx_vdec);
4938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
4948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
4968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
4978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
4988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanion_user_handle_t handle, int ionMapfd)
4998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) devicefd;
501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) size;
502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) base;
503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) handle;
504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) ionMapfd;
5058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
5068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
5078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else
5088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanVideoHeap::VideoHeap(int fd, size_t size, void* base)
5098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
5108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    // dup file descriptor, map once, use pmem
5118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    init(dup(fd), base, size, 0 , MEM_DEVICE);
5128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
5138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
5148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif // _ANDROID_
5158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
5168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
5178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::omx_vdec
5188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
5198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
5208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanConstructor
5218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
5228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
5238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone
5248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
5258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
5268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
5278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
5288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::omx_vdec():
5298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_error_propogated(false),
5308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_state(OMX_StateInvalid),
5318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_app_data(NULL),
5328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_inp_mem_ptr(NULL),
5338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_mem_ptr(NULL),
5348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_inp_err_count(0),
5358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    input_flush_progress (false),
5368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    output_flush_progress (false),
5378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    input_use_buffer (false),
5388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    output_use_buffer (false),
5398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    ouput_egl_buffers(false),
5408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_use_output_pmem(OMX_FALSE),
5418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_mem_region_smi(OMX_FALSE),
5428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_pvt_entry_pmem(OMX_FALSE),
5438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pending_input_buffers(0),
5448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pending_output_buffers(0),
5458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_bm_count(0),
5468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_inp_bm_count(0),
5478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_inp_bPopulated(OMX_FALSE),
5488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_bPopulated(OMX_FALSE),
5498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_flags(0),
5508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
5518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_heap_ptr(NULL),
5528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
5538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_inp_bEnabled(OMX_TRUE),
5548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_bEnabled(OMX_TRUE),
5558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_in_alloc_cnt(0),
5568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_platform_list(NULL),
5578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_platform_entry(NULL),
5588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_pmem_info(NULL),
5598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_pSwVdec(NULL),
5608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_pSwVdecIpBuffer(NULL),
5618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_pSwVdecOpBuffer(NULL),
5628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_nInputBuffer(0),
5638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_nOutputBuffer(0),
5648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_mem_ptr(NULL),
5658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_flush_dsp_progress(OMX_FALSE),
5668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_flush_swvdec_progress(OMX_FALSE),
5678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_bPopulated(OMX_FALSE),
5688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_bEnabled(OMX_TRUE),
5698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_swvdec_mode(-1),
5708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_fill_internal_bufers(OMX_TRUE),
5718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    arbitrary_bytes (true),
5728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    psource_frame (NULL),
5738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pdest_frame (NULL),
5748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_inp_heap_ptr (NULL),
5758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_phdr_pmem_ptr(NULL),
5768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_heap_inp_bm_count (0),
5778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    codec_type_parse ((codec_type)0),
5788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    first_frame_meta (true),
5798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frame_count (0),
5808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    nal_count (0),
5818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    nal_length(0),
5828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    look_ahead_nal (false),
5838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    first_frame(0),
5848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    first_buffer(NULL),
5858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    first_frame_size (0),
5868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_device_file_ptr(NULL),
5878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_vc1_profile((vc1_profile_type)0),
5888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    h264_last_au_ts(LLONG_MAX),
5898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    h264_last_au_flags(0),
5908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    prev_ts(LLONG_MAX),
5918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    rst_prev_ts(true),
5928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frm_int(0),
5938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    in_reconfig(false),
5948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_display_id(NULL),
5958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    h264_parser(NULL),
5968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    client_extradata(0),
5978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
5988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_enable_android_native_buffers(OMX_FALSE),
5998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_use_android_native_buffers(OMX_FALSE),
6008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
6018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_desc_buffer_ptr(NULL),
6028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    secure_mode(false),
6038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    codec_config_flag(false)
6048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
6058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /* Assumption is that , to begin with , we have all the frames with decoder */
6068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
6078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
6088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    char property_value[PROPERTY_VALUE_MAX] = {0};
6098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.debug.level", property_value, "1");
6108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    debug_level = atoi(property_value);
6118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
6148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
6158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.dec.debug.perf", property_value, "0");
6168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    perf_flag = atoi(property_value);
6178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (perf_flag)
6188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
6198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
6208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        dec_time.start();
6218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        proc_frms = latency = 0;
6228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
6238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    prev_n_filled_len = 0;
6248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
6258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.dec.debug.ts", property_value, "0");
6268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_debug_timestamp = atoi(property_value);
6278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
6288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug_timestamp)
6298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
6308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        time_stamp_dts.set_timestamp_reorder_mode(true);
6318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        time_stamp_dts.enable_debug_print(true);
6328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
6338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(&m_debug, 0, sizeof(m_debug));
6348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
6358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.dec.debug.concealedmb", property_value, "0");
6368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_debug_concealedmb = atoi(property_value);
6378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
6388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
6398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
6408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.dec.log.in", property_value, "0");
6418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_debug.in_buffer_log = atoi(property_value);
6428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
6438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
6448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.dec.log.out", property_value, "0");
6458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_debug.out_buffer_log = atoi(property_value);
6468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
6478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
6488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.dec.log.imb", property_value, "0");
6498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_debug.im_buffer_log = atoi(property_value);
6508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
6518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    sprintf(m_debug.log_loc, "%s", BUFFER_LOG_LOC);
6528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
6538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.log.loc", property_value, "");
6548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (*property_value)
6558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        strlcpy(m_debug.log_loc, property_value, PROPERTY_VALUE_MAX);
656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property_value[0] = '\0';
658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property_get("vidc.dec.debug.dyn.disabled", property_value, "0");
659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_disable_dynamic_buf_mode = atoi(property_value);
6608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
6618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(&m_cmp,0,sizeof(m_cmp));
6628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(&m_cb,0,sizeof(m_cb));
6638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset (&drv_ctx,0,sizeof(drv_ctx));
6648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
6658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
6668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(m_demux_offsets, 0, sizeof(m_demux_offsets) );
6678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_demux_entries = 0;
6688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    msg_thread_id = 0;
6698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    async_thread_id = 0;
6708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    msg_thread_created = false;
6718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    async_thread_created = false;
6728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_ICS_
6738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
6748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
6758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
6768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.timestamp_adjust = false;
6778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.video_driver_fd = -1;
6788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_vendor_config.pData = NULL;
6798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutexattr_t attr;
6808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
6818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_init(&m_lock, &attr);
6828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_init(&c_lock, &attr);
6838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    sem_init(&m_cmd_lock,0,0);
6848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    streaming[CAPTURE_PORT] =
6858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        streaming[OUTPUT_PORT] = false;
6868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
6878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    char extradata_value[PROPERTY_VALUE_MAX] = {0};
6888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.dec.debug.extradata", extradata_value, "0");
6898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_debug_extradata = atoi(extradata_value);
6908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
6918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
6928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
6938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    client_buffers.set_vdec_client(this);
6948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
6958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    dynamic_buf_mode = false;
6968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    out_dynamic_list = NULL;
6978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_smoothstreaming_mode = false;
6988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_smoothstreaming_width = 0;
6998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_smoothstreaming_height = 0;
7008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
7018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstatic const int event_type[] = {
7038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
7048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
7058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
7068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE,
7078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER,
7088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
7098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    V4L2_EVENT_MSM_VIDC_SYS_ERROR
7108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan};
7118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstatic OMX_ERRORTYPE subscribe_to_events(int fd)
7138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
7148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
7158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_event_subscription sub;
7168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
7178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int i,rc;
7188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (fd < 0) {
7198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
7208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
7218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
7228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for (i = 0; i < array_sz; ++i) {
7248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset(&sub, 0, sizeof(sub));
7258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sub.type = event_type[i];
7268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
7278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (rc) {
7288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type);
7298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
7308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
7318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
7328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (i < array_sz) {
7338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for (--i; i >=0 ; i--) {
7348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memset(&sub, 0, sizeof(sub));
7358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sub.type = event_type[i];
7368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
7378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (rc)
7388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
7398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
7408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorNotImplemented;
7418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
7428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
7438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
7448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstatic OMX_ERRORTYPE unsubscribe_to_events(int fd)
7478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
7488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
7498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_event_subscription sub;
7508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
7518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int i,rc;
7528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (fd < 0) {
7538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
7548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
7558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
7568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for (i = 0; i < array_sz; ++i) {
7588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset(&sub, 0, sizeof(sub));
7598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sub.type = event_type[i];
7608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
7618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (rc) {
7628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
7638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
7648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
7658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
7668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
7678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
7688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
7708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
7718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::~omx_vdec
7728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
7748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDestructor
7758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
7778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone
7788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
7808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
7818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
7828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::~omx_vdec()
7838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
7848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_pmem_info = NULL;
7858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_decoder_cmd dec;
7868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("In OMX vdec Destructor");
7878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_pipe_in) close(m_pipe_in);
7888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_pipe_out) close(m_pipe_out);
7898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_pipe_in = -1;
7908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_pipe_out = -1;
7918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
7928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (msg_thread_created)
7948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_join(msg_thread_id,NULL);
7958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((!m_pSwVdec || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY) &&
7968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (m_swvdec_mode != SWVDEC_MODE_PARSE_DECODE))
7978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
7988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit driver id %d", drv_ctx.video_driver_fd);
7998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        dec.cmd = V4L2_DEC_CMD_STOP;
8008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (drv_ctx.video_driver_fd >=0 )
8018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
8028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Stop decoder driver instance");
8038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
8048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
8058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("STOP Command failed");
8068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
8078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
8088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (async_thread_created)
8108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pthread_join(async_thread_id,NULL);
8118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsubscribe_to_events(drv_ctx.video_driver_fd);
8138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        close(drv_ctx.video_driver_fd);
8148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
8158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_pSwVdec)
8178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
8188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("SwVdec_Stop");
8198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (SWVDEC_S_SUCCESS != SwVdec_Stop(m_pSwVdec))
8208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
8218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("SwVdec_Stop Command failed in vdec destructor");
8228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            SwVdec_DeInit(m_pSwVdec);
8238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pSwVdec = NULL;
8248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
8258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
8268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_destroy(&m_lock);
8288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_destroy(&c_lock);
8298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    sem_destroy(&m_cmd_lock);
8308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (perf_flag)
8318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
8328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
8338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        dec_time.end();
8348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
8358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
8368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
8378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
8398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
8408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_requestbuffers bufreq;
8418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int rc = 0;
8428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT){
8438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
8448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufreq.count = 0;
8458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
8468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
8478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if(buffer_type == VDEC_BUFFER_TYPE_INPUT) {
8488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
8498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufreq.count = 0;
8508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
8518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
8528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
8538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return rc;
8548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
8558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
8578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
8588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::OMXCntrlProcessMsgCb
8598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
8618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanIL Client callbacks are generated through this routine. The decoder
8628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanprovides the thread context for this routine.
8638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
8658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanctxt -- Context information related to the self.
8668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanid   -- Event identifier. This could be any of the following:
8678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan1. Command completion event
8688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan2. Buffer done callback event
8698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan3. Frame done callback event
8708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
8728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
8738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
8758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
8768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long p1; // Parameter - 1
878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long p2; // Parameter - 2
879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long ident;
8808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned int qsize=0; // qsize
8818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx_vdec *pThis = (omx_vdec *) ctxt;
8828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!pThis)
8848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
8858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out",
8868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            __func__);
8878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
8888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
8898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    // Protect the shared queue data structure
8918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    do
8928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
8938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*Read the message id's from the queue*/
8948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_lock(&pThis->m_lock);
8958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        qsize = pThis->m_cmd_q.m_size;
8968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(qsize)
8978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            pThis->m_cmd_q.pop_entry(&p1, &p2, &ident);
8998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
9008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
9018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause)
9028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
9038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            qsize = pThis->m_ftb_q.m_size;
9048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (qsize)
9058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                pThis->m_ftb_q.pop_entry(&p1, &p2, &ident);
9078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
9088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
9098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
9108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause)
9118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
9128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            qsize = pThis->m_ftb_q_dsp.m_size;
9138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (qsize)
9148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                pThis->m_ftb_q_dsp.pop_entry(&p1, &p2, &ident);
9168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
9178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
9188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
9198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause)
9208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
9218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            qsize = pThis->m_etb_q.m_size;
9228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (qsize)
9238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                pThis->m_etb_q.pop_entry(&p1, &p2, &ident);
9258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
9268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
9278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
9288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause)
9298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
9308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            qsize = pThis->m_etb_q_swvdec.m_size;
9318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (qsize)
9328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                pThis->m_etb_q_swvdec.pop_entry(&p1, &p2, &ident);
9348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
9358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
9368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
9378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_unlock(&pThis->m_lock);
9388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
9398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*process message if we have one*/
9408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(qsize > 0)
9418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
9428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            id = ident;
9438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            switch (id)
9448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
9458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_EVENT:
9468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pThis->m_cb.EventHandler)
9478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
9488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    switch (p1)
9498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
9508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    case OMX_CommandStateSet:
9518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->m_state = (OMX_STATETYPE) p2;
9528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d",
9538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->m_state);
9548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
9558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            OMX_EventCmdComplete, p1, p2, NULL);
9568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        break;
9578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
9588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    case OMX_EventError:
959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        if(p2 == (unsigned long)OMX_StateInvalid)
9608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
9618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid");
9628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->m_state = (OMX_STATETYPE) p2;
9638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
9648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
9658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        else if (p2 == (unsigned long)OMX_ErrorHardware)
9678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
9688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->omx_report_error();
9698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
9708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        else
9718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
9728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
9738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_EventError, p2, (OMX_U32)NULL, NULL );
9748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
9758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        break;
9768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
9778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    case OMX_CommandPortDisable:
978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%lu]", p2);
9798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (BITMASK_PRESENT(&pThis->m_flags,
9808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
9818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
9828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
9838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            break;
9848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
9858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig)
9868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
9878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            OMX_ERRORTYPE eRet = OMX_ErrorNone;
9888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if (!pThis->m_pSwVdec || pThis->m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
9898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            {
9908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
9918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                if(release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
9928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_HIGH("Failed to release output buffers");
993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            }
9948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            if (pThis->m_pSwVdec)
996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            {
997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                SWVDEC_STATUS SwStatus;
998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                DEBUG_PRINT_HIGH("In port reconfig, SwVdec_Stop");
999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                SwStatus = SwVdec_Stop(pThis->m_pSwVdec);
1000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                if (SWVDEC_S_SUCCESS != SwStatus)
10018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                {
1002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                   DEBUG_PRINT_ERROR("SwVdec_Stop failed (%d)",SwStatus);
1003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                   pThis->omx_report_error();
1004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                   break;
10058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                }
10068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
1007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
10088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            OMX_ERRORTYPE eRet1 = pThis->get_buffer_req_swvdec();
10098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->in_reconfig = false;
10108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if(eRet !=  OMX_ErrorNone)
10118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            {
10128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("get_buffer_req_swvdec failed eRet = %d",eRet);
10138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                pThis->omx_report_error();
10148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                break;
10158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
10168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
10178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
10188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            OMX_EventCmdComplete, p1, p2, NULL );
10198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        break;
10208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    case OMX_CommandPortEnable:
10218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%d]", p2);
1022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        if (p2 == OMX_CORE_OUTPUT_PORT_INDEX &&
1023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            pThis->m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
10248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
10258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("send all interm buffers to dsp after port enabled");
10268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->fill_all_buffers_proxy_dsp(&pThis->m_cmp);
10278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
10288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
10298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            OMX_EventCmdComplete, p1, p2, NULL );
10308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        break;
10318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    default:
10338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
10348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            OMX_EventCmdComplete, p1, p2, NULL );
10358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        break;
10368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
10388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
10398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
10408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
10418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
10428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
10438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
10448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
10458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
10468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
10478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
10488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure");
10498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pThis->omx_report_error ();
10508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
10518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
10528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_ETB:
10538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
10548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
10558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
10568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure");
10578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pThis->omx_report_error ();
10588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
10598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
10608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_FTB:
10628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
10638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
10648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
10658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure");
10668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pThis->omx_report_error ();
10678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
10688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
10698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_COMMAND:
10718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
10728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (OMX_U32)p2,(OMX_PTR)NULL);
10738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
10748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_EBD:
10768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR)
10788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
10798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure");
10808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pThis->omx_report_error ();
10818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
10828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
10838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
10848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1)
10858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
10868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->m_inp_err_count++;
10878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->time_stamp_dts.remove_time_stamp(
10888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
10898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
10908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            ?true:false);
10918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
10928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else
10938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
10948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->m_inp_err_count = 0;
10958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
10968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if ( pThis->empty_buffer_done(&pThis->m_cmp,
10978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
10988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
10998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("empty_buffer_done failure");
11008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->omx_report_error ();
11018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
11028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if(pThis->m_inp_err_count >= MAX_INPUT_ERROR)
11038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
11048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
11058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->omx_report_error ();
11068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
11078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
11088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
11098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
11108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
11118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    int64_t *timestamp = (int64_t *)p1;
11128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (p1)
11138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
11148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->time_stamp_dts.remove_time_stamp(*timestamp,
11158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
11168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            ?true:false);
11178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        free(timestamp);
11188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
11198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
11208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
11218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_FBD:
11228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (p2 != VDEC_S_SUCCESS)
11238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
11248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure");
11258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pThis->omx_report_error ();
11268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
11278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else if ( pThis->fill_buffer_done(&pThis->m_cmp,
11288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
11298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
11308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("fill_buffer_done failure");
11318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pThis->omx_report_error ();
11328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
11338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
11348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
11358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
11368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (!pThis->input_flush_progress)
11378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
11388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("WARNING: Unexpected INPUT_FLUSH from driver");
11398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
11408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
11418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
11428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pThis->execute_input_flush();
11438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (pThis->m_cb.EventHandler)
11448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
11458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (p2 != VDEC_S_SUCCESS)
11468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
11478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
11488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->omx_report_error ();
11498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
11508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        else
11518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
11528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            /*Check if we need generate event for Flush done*/
11538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if(BITMASK_PRESENT(&pThis->m_flags,
11548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_COMPONENT_INPUT_FLUSH_PENDING))
11558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            {
11568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
11578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("Input Flush completed - Notify Client");
11588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
11598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_EventCmdComplete,OMX_CommandFlush,
11608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_CORE_INPUT_PORT_INDEX,NULL );
11618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
11628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,
11638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_COMPONENT_IDLE_PENDING))
11648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            {
11658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                if (!pThis->m_pSwVdec || pThis->m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
11668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                {
11678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    if(pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
11688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port");
11698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        pThis->omx_report_error ();
11708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    } else {
11718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        pThis->streaming[OUTPUT_PORT] = false;
11728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    }
11738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                }
11748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
11758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
11768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
11778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else
11788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
11798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
11808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
11818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
11828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
11838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
11848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
11858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Driver flush o/p Port complete");
11868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (!pThis->output_flush_progress)
11878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
11888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("WARNING: Unexpected OUTPUT_FLUSH from driver");
11898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
11908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
11918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
11928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pThis->execute_output_flush();
11938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (pThis->m_interm_flush_dsp_progress)
11948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
11958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->execute_output_flush_dsp();
11968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
11978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (pThis->m_interm_flush_swvdec_progress)
11988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
11998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->execute_input_flush_swvdec();
12008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
12018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (pThis->m_cb.EventHandler)
12028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
12038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (p2 != VDEC_S_SUCCESS)
12048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
12058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
12068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->omx_report_error ();
12078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
12088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        else
12098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
12108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            /*Check if we need generate event for Flush done*/
12118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if(BITMASK_PRESENT(&pThis->m_flags,
12128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_COMPONENT_OUTPUT_FLUSH_PENDING))
12138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            {
12148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                if (pThis->release_interm_done() == false)
12158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                {
12168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_ERROR("OMX_COMPONENT_OUTPUT_FLUSH failed not all interm buffers are returned");
12178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    pThis->omx_report_error ();
12188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    break;
12198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                }
12208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                pThis->m_fill_internal_bufers = OMX_TRUE;
12218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("Notify Output Flush done");
12228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
12238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
12248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_EventCmdComplete,OMX_CommandFlush,
12258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_CORE_OUTPUT_PORT_INDEX,NULL );
12268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
12278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if(BITMASK_PRESENT(&pThis->m_flags,
12288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING))
12298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            {
12308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("Internal flush complete");
12318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                BITMASK_CLEAR (&pThis->m_flags,
12328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
12338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
12348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED))
12358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                {
1236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    pThis->post_event((unsigned long)OMX_CommandPortDisable,
1237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        (unsigned long)OMX_CORE_OUTPUT_PORT_INDEX,
1238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        (unsigned long)OMX_COMPONENT_GENERATE_EVENT);
12398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,
12408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
12418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,
12428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
12438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
12448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                }
12458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
12468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
12478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING))
12488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            {
12498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                if (!pThis->m_pSwVdec || pThis->m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
12508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                {
12518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    if(pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
12528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port");
12538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        pThis->omx_report_error ();
12548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        break;
12558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    }
12568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    pThis->streaming[CAPTURE_PORT] = false;
12578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                }
12588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                if (!pThis->input_flush_progress)
12598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                {
12608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_LOW("Output flush done hence issue stop");
1261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    pThis->post_event ((unsigned long)NULL, (unsigned long)VDEC_S_SUCCESS,\
1262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        (unsigned long)OMX_COMPONENT_GENERATE_STOP_DONE);
12638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                }
12648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
12658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
12668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
12678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else
12688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
12698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
12708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
12718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
12728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
12738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
12748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH_DSP:
12758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Dsp Driver flush o/p Port complete");
12768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (!pThis->m_interm_flush_dsp_progress)
12778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
12788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("WARNING: Unexpected OUTPUT_FLUSH_DSP from driver");
12798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
12808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
12818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
12828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    // check if we need to flush swvdec
12838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    bool bFlushSwVdec = false;
12848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    SWVDEC_BUFFER_FLUSH_TYPE aFlushType = SWVDEC_FLUSH_ALL;
12858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (pThis->m_interm_flush_swvdec_progress)
12868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
12878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        aFlushType = SWVDEC_FLUSH_ALL;
12888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        bFlushSwVdec = true;
12898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
12908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else if (pThis->output_flush_progress)
12918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
12928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("Flush swvdec output only ");
12938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        aFlushType = SWVDEC_FLUSH_OUTPUT;
12948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        bFlushSwVdec = true;
12958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
12968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
12978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Flush swvdec %d, interm flush %d output flush %d swvdec flushType %d",
12988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        bFlushSwVdec, pThis->m_interm_flush_swvdec_progress, pThis->output_flush_progress, aFlushType);
12998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
13008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (bFlushSwVdec)
13018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
13028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (SwVdec_Flush(pThis->m_pSwVdec, aFlushType) != SWVDEC_S_SUCCESS)
13038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
13048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("Flush swvdec Failed ");
13058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
13068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
13078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else
13088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
13098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->execute_output_flush_dsp();
13108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
13118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
13128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
13138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
13148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_START_DONE:
13158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE");
13168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
13178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pThis->m_cb.EventHandler)
13188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
13198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (p2 != VDEC_S_SUCCESS)
13208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
13218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure");
13228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->omx_report_error ();
13238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
13248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else
13258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
13268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success");
13278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
13288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
13298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("Move to executing");
13308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            // Send the callback now
13318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
13328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->m_state = OMX_StateExecuting;
13338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
13348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_EventCmdComplete,OMX_CommandStateSet,
13358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_StateExecuting, NULL);
13368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
13378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        else if (BITMASK_PRESENT(&pThis->m_flags,
13388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            OMX_COMPONENT_PAUSE_PENDING))
13398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
13408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if (/*ioctl (pThis->drv_ctx.video_driver_fd,
13418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                VDEC_IOCTL_CMD_PAUSE,NULL ) < */0)
13428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            {
13438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed");
13448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                pThis->omx_report_error ();
13458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
13468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
13478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
13488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
13498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
13508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
13518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Event Handler callback is NULL");
13528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
13538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
13548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
13558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_PAUSE_DONE:
13568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
13578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pThis->m_cb.EventHandler)
13588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
13598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (p2 != VDEC_S_SUCCESS)
13608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
13618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
13628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->omx_report_error ();
13638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
13648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else
13658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
13668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->complete_pending_buffer_done_cbs();
13678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING))
13688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
13698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
13708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            //Send the callback now
13718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
13728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->m_state = OMX_StatePause;
13738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
13748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_EventCmdComplete,OMX_CommandStateSet,
13758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_StatePause, NULL);
13768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
13778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
13788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
13798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
13808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
13818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
13828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
13838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
13848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
13858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
13868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_RESUME_DONE:
13878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
13888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pThis->m_cb.EventHandler)
13898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
13908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (p2 != VDEC_S_SUCCESS)
13918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
13928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed");
13938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->omx_report_error ();
13948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
13958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else
13968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
13978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING))
13988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
13998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("Moving the decoder to execute state");
14008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            // Send the callback now
14018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
14028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->m_state = OMX_StateExecuting;
14038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if (pThis->m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
14048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            {
14058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                pThis->fill_all_buffers_proxy_dsp(&pThis->m_cmp);
14068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
14078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
14088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_EventCmdComplete,OMX_CommandStateSet,
14098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_StateExecuting,NULL);
14108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
14118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
14128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
14138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
14148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
14158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
14168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
14178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
14188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
14198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
14208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_STOP_DONE:
14218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
14228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pThis->m_cb.EventHandler)
14238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
14248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (p2 != VDEC_S_SUCCESS)
14258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
14268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
14278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->omx_report_error ();
14288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
14298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else
14308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
14318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->complete_pending_buffer_done_cbs();
14328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if(BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING))
14338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
14348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success");
14358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            // Send the callback now
14368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
14378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->m_state = OMX_StateIdle;
14388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("Move to Idle State");
14398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
14408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_EventCmdComplete,OMX_CommandStateSet,
14418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                OMX_StateIdle,NULL);
14428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
14438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
14448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
14458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
14468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
14478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
14488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
14498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
14508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
14518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
14528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
14538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
14548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
14558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (p2 == OMX_IndexParamPortDefinition) {
14568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pThis->in_reconfig = true;
14578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
14588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pThis->m_cb.EventHandler) {
14598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
14608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        OMX_EventPortSettingsChanged, p1, p2, NULL );
14618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                } else {
14628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
14638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
14648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
14658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
14668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
14678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
14688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
14698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
14708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        format = OMX_InterlaceInterleaveFrameTopFieldFirst;
14718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
14728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
14738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else //unsupported interlace format; raise a error
14748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        event = OMX_EventError;
14758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (pThis->m_cb.EventHandler) {
14768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
14778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            event, format, 0, NULL );
14788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    } else {
14798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
14808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
14818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
14828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
14838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
14848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_EOS_DONE:
14858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
14868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pThis->m_cb.EventHandler) {
14878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
14888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
14898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                } else {
14908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
14918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
14928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pThis->prev_ts = LLONG_MAX;
14938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pThis->rst_prev_ts = true;
14948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
14958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
14968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
14978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
14988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pThis->omx_report_error ();
14998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
15008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING:
15028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING");
15038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pThis->omx_report_unsupported_setting();
15048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
15058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
15078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
15088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
15098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (pThis->m_cb.EventHandler) {
15108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
15118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
15128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    } else {
15138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
15148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
15158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
15168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
15178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_ETB_SWVDEC:
15198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
15208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_ETB_SWVDEC");
15218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (pThis->empty_this_buffer_proxy_swvdec((OMX_HANDLETYPE)p1,\
15228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
15238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
15248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("empty_this_buffer_proxy_swvdec failure");
15258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->omx_report_error ();
15268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
15278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
15288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
15298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_EBD_SWVDEC:
15318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
15328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EBD_SWVDEC");
15338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (p2 != VDEC_S_SUCCESS)
15348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
15358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD_SWVDEC failure");
15368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->omx_report_error ();
15378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
15388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else if ( pThis->empty_buffer_done_swvdec(&pThis->m_cmp,
15398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
15408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
15418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("empty_buffer_done_swvdec failure");
15428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->omx_report_error ();
15438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
15448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
15458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
15468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_FTB_DSP:
15488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
15498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_FTB_DSP");
15508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if ( pThis->fill_this_buffer_proxy_dsp((OMX_HANDLETYPE)p1,\
15518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone)
15528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
15538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("fill_this_buffer_proxy_dsp failure");
15548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->omx_report_error ();
15558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
15568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
15578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
15588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case OMX_COMPONENT_GENERATE_FBD_DSP:
15608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
15618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_FBD_DSP");
15628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (p2 != VDEC_S_SUCCESS)
15638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
15648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD_DSP failure");
15658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->omx_report_error ();
15668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
15678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else if ( pThis->fill_buffer_done_dsp(&pThis->m_cmp,
15688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
15698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
15708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("fill_buffer_done failure");
15718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pThis->omx_report_error ();
15728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
15738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
15768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
15778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            default:
15798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
15808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
15818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
15828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_lock(&pThis->m_lock);
15838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        qsize = pThis->m_cmd_q.m_size;
15848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pThis->m_state != OMX_StatePause)
15858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size +
15868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pThis->m_ftb_q_dsp.m_size + pThis->m_etb_q_swvdec.m_size);
15878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_unlock(&pThis->m_lock);
15888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
15898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while(qsize>0);
15908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
15928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint omx_vdec::update_resolution(int width, int height, int stride, int scan_lines)
15948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
15958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int format_changed = 0;
15968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((height != (int)drv_ctx.video_resolution.frame_height) ||
15978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (width != (int)drv_ctx.video_resolution.frame_width)) {
15988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)",
15998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                width, drv_ctx.video_resolution.frame_width,
16008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                height,drv_ctx.video_resolution.frame_height);
16018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        format_changed = 1;
16028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
16038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.video_resolution.frame_height = height;
16048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.video_resolution.frame_width = width;
16058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.video_resolution.scan_lines = scan_lines;
16068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.video_resolution.stride = stride;
16078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    rectangle.nLeft = 0;
16088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    rectangle.nTop = 0;
16098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    rectangle.nWidth = drv_ctx.video_resolution.frame_width;
16108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    rectangle.nHeight = drv_ctx.video_resolution.frame_height;
16118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return format_changed;
16128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
16138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
16148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::is_video_session_supported()
16158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
16168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((drv_ctx.video_resolution.frame_width * drv_ctx.video_resolution.frame_height >
16178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan         m_decoder_capability.max_width * m_decoder_capability.max_height) ||
16188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan         (drv_ctx.video_resolution.frame_width* drv_ctx.video_resolution.frame_height <
16198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan          m_decoder_capability.min_width * m_decoder_capability.min_height))
16208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
16218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR(
16228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)",
16238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.video_resolution.frame_width,
16248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.video_resolution.frame_height,
16258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_decoder_capability.min_width,
16268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_decoder_capability.min_height,
16278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_decoder_capability.max_width,
16288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_decoder_capability.max_height);
16298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorUnsupportedSetting;
16308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
16318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("video session supported");
16328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
16338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
16348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
16358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint omx_vdec::log_input_buffers(const char *buffer_addr, int buffer_len)
16368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
16378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.in_buffer_log && !m_debug.infile) {
16388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE) ||
16398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           !strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.hevchybrid", OMX_MAX_STRINGNAME_SIZE) ||
16408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           !strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.hevcswvdec", OMX_MAX_STRINGNAME_SIZE)) {
16418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           sprintf(m_debug.infile_name, "%s/input_dec_%d_%d_%p.hevc",
16428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                   m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
16438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
16448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.infile = fopen (m_debug.infile_name, "ab");
16458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_debug.infile) {
16468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile_name);
16478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_debug.infile_name[0] = '\0';
16488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
16498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
16508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
16518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.infile && buffer_addr && buffer_len) {
16528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fwrite(buffer_addr, buffer_len, 1, m_debug.infile);
16538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
16548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return 0;
16558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
16568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
16578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint omx_vdec::log_output_buffers(OMX_BUFFERHEADERTYPE *buffer)
16588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
16598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.out_buffer_log && !m_debug.outfile) {
16608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sprintf(m_debug.outfile_name, "%s/output_%d_%d_%p.yuv",
16618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
16628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.outfile = fopen (m_debug.outfile_name, "ab");
16638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_debug.outfile) {
16648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Failed to open output file: %s for logging", m_debug.log_loc);
16658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_debug.outfile_name[0] = '\0';
16668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
16678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
16688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
16698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.outfile && buffer && buffer->nFilledLen) {
16708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int buf_index = buffer - m_out_mem_ptr;
16718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int stride = drv_ctx.video_resolution.stride;
16728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int scanlines = drv_ctx.video_resolution.scan_lines;
16738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_smoothstreaming_mode) {
16748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            stride = drv_ctx.video_resolution.frame_width;
16758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            scanlines = drv_ctx.video_resolution.frame_height;
16768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            stride = (stride + DEFAULT_WIDTH_ALIGNMENT - 1) & (~(DEFAULT_WIDTH_ALIGNMENT - 1));
16778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            scanlines = (scanlines + DEFAULT_HEIGHT_ALIGNMENT - 1) & (~(DEFAULT_HEIGHT_ALIGNMENT - 1));
16788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
16798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
16808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned i;
16818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int bytes_written = 0;
16828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Logging width/height(%u/%u) stride/scanlines(%u/%u)",
16838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.video_resolution.frame_width,
16848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.video_resolution.frame_height, stride, scanlines);
16858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
16868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan             bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile);
16878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan             temp += stride;
16888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
16898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
16908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int stride_c = stride;
16918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for(i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
16928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile);
16938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            temp += stride_c;
16948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
16958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
16968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return 0;
16978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
16988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
16998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint omx_vdec::log_im_buffer(OMX_BUFFERHEADERTYPE * buffer)
17008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
17018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.im_buffer_log && !m_debug.imbfile) {
17028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sprintf(m_debug.imbfile_name, "%s/imb_%d_%d_%p.bin",
17038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
17048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.imbfile = fopen (m_debug.imbfile_name, "ab");
17058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_debug.imbfile) {
17068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Failed to open intermediate file: %s for logging", m_debug.log_loc);
17078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_debug.imbfile_name[0] = '\0';
17088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
17098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
17108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
17118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
17128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer && buffer->nFilledLen)
17138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
17148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fwrite(&buffer->nFilledLen, sizeof(buffer->nFilledLen), 1, m_debug.imbfile);
17158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fwrite(buffer->pBuffer, sizeof(uint8), buffer->nFilledLen, m_debug.imbfile);
17168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
17178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return 0;
17188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
17198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
17208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
17218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
17228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::ComponentInit
17238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
17248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
17258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanInitialize the component.
17268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
17278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
17288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanctxt -- Context information related to the self.
17298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanid   -- Event identifier. This could be any of the following:
17308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan1. Command completion event
17318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan2. Buffer done callback event
17328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan3. Frame done callback event
17338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
17348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
17358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
17368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
17378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
17388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
17398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
17408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
17418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
17428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_fmtdesc fdesc;
17438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_format fmt;
17448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_requestbuffers bufreq;
17458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_control control;
17468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_frmsizeenum frmsize;
17478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned int   alignment = 0,buffer_size = 0;
17488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int fds[2];
17498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int r,ret=0;
17508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool codec_ambiguous = false;
17518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
17528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_decoder_capability.min_width = 16;
17538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_decoder_capability.min_height = 16;
17548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_decoder_capability.max_width = 1920;
17558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_decoder_capability.max_height = 1080;
17568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    strlcpy(drv_ctx.kind,role,128);
17578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_STRING device_name = (OMX_STRING)"/dev/video/q6_dec";
17588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",
17598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_MAX_STRINGNAME_SIZE)) ||
17608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevchybrid",
17618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_MAX_STRINGNAME_SIZE)))
17628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
17638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.video_driver_fd = open(device_name, O_RDWR);
17648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(drv_ctx.video_driver_fd == 0){
17658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.video_driver_fd = open(device_name, O_RDWR);
17668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
17678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(drv_ctx.video_driver_fd < 0)
17688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
17698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno);
17708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
17718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
17728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("omx_vdec::component_init(%s): Open device %s returned fd %d",
17738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            role, device_name, drv_ctx.video_driver_fd);
17748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
17758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
17768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Omx_vdec::Comp Init for full SW hence skip Q6 open");
17778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
17788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    // Copy the role information which provides the decoder kind
17798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    strlcpy(drv_ctx.kind,role,128);
17808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
17818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevchybrid",
17828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_MAX_STRINGNAME_SIZE))
17838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
17848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
17858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.width = 320;
17868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.height = 240;
17878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_HEVC_HYBRID;
17888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
17898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ret) {
17908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Failed to set format(V4L2_PIX_FMT_HEVC_HYBRID)");
17918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Switch to HEVC fullDSP as HYBRID is not supported");
17928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            strlcpy(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", 128);
17938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
17948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else {
17958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("HEVC HYBRID is supported");
17968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
17978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
17988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
17998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevchybrid",
18008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_MAX_STRINGNAME_SIZE))
18018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
1802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("HEVC Hybrid mode");
18038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_swvdec_mode = SWVDEC_MODE_DECODE_ONLY;
18048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
18058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevcswvdec",
18068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_MAX_STRINGNAME_SIZE))
18078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
1808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("HEVC Full SW mode");
1809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        maxSmoothStreamingWidth = 1280;
1810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        maxSmoothStreamingHeight = 720;
1811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_decoder_capability.max_width = 1280;
1812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_decoder_capability.max_height = 720;
18138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_swvdec_mode = SWVDEC_MODE_PARSE_DECODE;
18148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
18158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",
18168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_MAX_STRINGNAME_SIZE))
18178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
18188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Full DSP mode");
18198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        maxSmoothStreamingWidth = 1280;
18208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        maxSmoothStreamingHeight = 720;
18218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_decoder_capability.max_width = 1280;
18228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_decoder_capability.max_height = 720;
18238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_swvdec_mode = -1;
18248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
18258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else {
18268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Unknown Component");
18278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidComponentName;
18288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
18298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
18308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC;
1831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    eCompressionFormat = OMX_VIDEO_CodingHEVC;
18328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    codec_type_parse = CODEC_TYPE_HEVC;
18338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_frame_parser.init_start_codes (codec_type_parse);
18348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_frame_parser.init_nal_length(nal_length);
18358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
18368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    update_resolution(1280, 720, 1280, 720);
18378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
18388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
18398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
18408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!client_buffers.set_color_format(dest_color_format)) {
18418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Setting color format failed");
18428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
18438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
18448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
18458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
18468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.frame_rate.fps_denominator = 1;
18478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
18488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.interm_op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
18498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
18508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (secure_mode) {
18518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.interm_op_buf.alignment=SZ_1M;
18528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.op_buf.alignment=SZ_1M;
18538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ip_buf.alignment=SZ_1M;
18548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else {
18558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.op_buf.alignment=SZ_4K;
18568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.interm_op_buf.alignment=SZ_4K;
18578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ip_buf.alignment=SZ_4K;
18588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
18598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
18608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.extradata = 0;
18618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
18628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
18638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_swvdec_mode >= 0)
18648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
18658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // Init for SWCodec
18668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH(":Initializing SwVdec mode %d", m_swvdec_mode);
18678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset(&sSwVdecParameter, 0, sizeof(SWVDEC_INITPARAMS));
18688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sSwVdecParameter.sDimensions.nWidth = 1280;
18698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sSwVdecParameter.sDimensions.nHeight = 720;
18708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sSwVdecParameter.eDecType = SWVDEC_DECODER_HEVC;
18718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sSwVdecParameter.eColorFormat = SWVDEC_FORMAT_NV12;
18728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sSwVdecParameter.uProfile.eHevcProfile = SWVDEC_HEVC_MAIN_PROFILE;
18738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sSwVdecParameter.sMode.eMode = (SWVDEC_MODE_TYPE)m_swvdec_mode;
18748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
18758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        //SWVDEC_CALLBACK       m_callBackInfo;
18768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_callBackInfo.FillBufferDone   = swvdec_fill_buffer_done_cb;
18778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_callBackInfo.EmptyBufferDone  = swvdec_input_buffer_done_cb;
18788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_callBackInfo.HandleEvent      = swvdec_handle_event_cb;
18798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_callBackInfo.pClientHandle    = this;
18808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        SWVDEC_STATUS sRet = SwVdec_Init(&sSwVdecParameter, &m_callBackInfo, &m_pSwVdec);
18818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (sRet != SWVDEC_S_SUCCESS)
18828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
18838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("SwVdec_Init returned %d, ret insufficient resources", sRet);
18848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
18858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
18868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
18878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
18888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!m_pSwVdec || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
18898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
18908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = pthread_create(&async_thread_id,0,async_message_thread,this);
18918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(ret < 0) {
18928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            close(drv_ctx.video_driver_fd);
18938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to create async_message_thread");
18948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
18958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
18968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        async_thread_created = true;
18978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
18988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        capture_capability= V4L2_PIX_FMT_NV12;
18998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = subscribe_to_events(drv_ctx.video_driver_fd);
19008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ret) {
19018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Subscribe Event Failed");
19028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
19038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
19058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        struct v4l2_capability cap;
19068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
19078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ret) {
19088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to query capabilities");
19098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /*TODO: How to handle this case */
19108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else {
19118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
19128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                " version = %d, capabilities = %x", cap.driver, cap.card,
19138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                cap.bus_info, cap.version, cap.capabilities);
19148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret=0;
19168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
19178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fdesc.index=0;
19188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
19198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
19208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                fdesc.pixelformat, fdesc.flags);
19218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fdesc.index++;
19228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
19248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fdesc.index=0;
19258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
19268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
19278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
19288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                fdesc.pixelformat, fdesc.flags);
19298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fdesc.index++;
19308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
19328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        output_capability = V4L2_PIX_FMT_HEVC;
19338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
19348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
19358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            output_capability = V4L2_PIX_FMT_HEVC_HYBRID;
19368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("output_capability %d, V4L2_PIX_FMT_HEVC_HYBRID %d", output_capability, V4L2_PIX_FMT_HEVC_HYBRID);
19388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
19398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
19408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
19418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
19428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
19438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
19448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ret) {
19458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /*TODO: How to handle this case */
19468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set format on output port");
19478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
19488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set Format was successful");
19508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        //Get the hardware capabilities
19518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset((void *)&frmsize,0,sizeof(frmsize));
19528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frmsize.index = 0;
19538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frmsize.pixel_format = output_capability;
19548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd,
19558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                VIDIOC_ENUM_FRAMESIZES, &frmsize);
19568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
19578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           DEBUG_PRINT_ERROR("Failed to get framesizes");
19588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           return OMX_ErrorHardware;
19598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
19618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
19628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_decoder_capability.min_width = frmsize.stepwise.min_width;
19638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_decoder_capability.max_width = frmsize.stepwise.max_width;
19648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_decoder_capability.min_height = frmsize.stepwise.min_height;
19658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_decoder_capability.max_height = frmsize.stepwise.max_height;
19668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
19688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
19698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
19708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
19718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
19728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
19738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ret) {
19748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /*TODO: How to handle this case */
19758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set format on capture port");
19768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set Format was successful");
19788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(secure_mode){
19798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
19808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.value = 1;
19818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret);
19828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
19838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (ret) {
19848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret);
19858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                close(drv_ctx.video_driver_fd);
19868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorInsufficientResources;
19878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
19888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
19908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*Get the Buffer requirements for input(input buffer) and output ports(intermediate buffer) from Q6*/
19918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
19928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
19938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
19948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.idr_only_decoding = 0;
19958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet=get_buffer_req(&drv_ctx.ip_buf);
19968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Input Buffer Size =%d",drv_ctx.ip_buf.buffer_size);
19978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
19988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE)
19998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
20008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        SWVDEC_PROP prop_dimen, prop_attr;
20018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        capture_capability = V4L2_PIX_FMT_NV12;
20038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        output_capability = V4L2_PIX_FMT_HEVC;
20048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        prop_dimen.ePropId = SWVDEC_PROP_ID_DIMENSIONS;
20068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        prop_dimen.uProperty.sDimensions.nWidth = drv_ctx.video_resolution.frame_width;
20078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        prop_dimen.uProperty.sDimensions.nHeight = drv_ctx.video_resolution.frame_height;
20088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = SwVdec_SetProperty(m_pSwVdec,&prop_dimen);
20098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ret) {
20108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set dimensions to SwVdec in full SW");
20118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
20128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
20138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set dimensions to SwVdec in full SW successful");
20148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        prop_attr.ePropId = SWVDEC_PROP_ID_FRAME_ATTR;
20158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        prop_attr.uProperty.sFrameAttr.eColorFormat = SWVDEC_FORMAT_NV12;
20168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = SwVdec_SetProperty(m_pSwVdec,&prop_attr);
20178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ret) {
20188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set color fmt to SwVdec in full SW");
20198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
20208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
20218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set dimensions and color format successful");
20228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        //TODO: Get the supported min/max dimensions of full SW solution
20248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.idr_only_decoding = 0;
20268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
20278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_state = OMX_StateLoaded;
20298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef DEFAULT_EXTRADATA
20308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (eRet == OMX_ErrorNone && !secure_mode)
20318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        enable_extradata(DEFAULT_EXTRADATA, true, true);
20328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
20338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    get_buffer_req_swvdec();
20358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Input Buffer Size %d Interm Buffer Size %d Output Buffer Size =%d",
20368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ip_buf.buffer_size, drv_ctx.interm_op_buf.buffer_size,
20378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.op_buf.buffer_size);
20388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
20408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
20418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    h264_scratch.nFilledLen = 0;
20428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    h264_scratch.nOffset = 0;
20438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (h264_scratch.pBuffer == NULL)
20458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
20468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed ");
20478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInsufficientResources;
20488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
20498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(pipe(fds))
20518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
20528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("pipe creation failed");
20538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
20548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
20558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
20568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
20578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(fds[0] == 0 || fds[1] == 0)
20588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
20598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (pipe (fds))
20608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
20618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("pipe creation failed");
20628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorInsufficientResources;
20638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
20648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
20658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pipe_in = fds[0];
20668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pipe_out = fds[1];
20678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        r = pthread_create(&msg_thread_id,0,message_thread,this);
20688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(r < 0)
20708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
20718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("component_init(): message_thread creation failed");
20728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
20738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
20748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        msg_thread_created = true;
20758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
20768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (eRet != OMX_ErrorNone && ( (!m_pSwVdec) || (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY) ))
20788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
20798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Component Init Failed eRet %d m_pSwVdec %p m_swvdec_mode %d", eRet, m_pSwVdec, m_swvdec_mode);
20808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
20818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
20828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
20838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("omx_vdec::component_init() success");
20848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
20858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
20868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
20878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
20888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
20908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
20918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::GetComponentVersion
20928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
20948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanReturns the component version.
20958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
20978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanTBD.
20988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
20998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
21008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ErrorNone.
21018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
21028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
21038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::get_component_version(
21048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_HANDLETYPE hComp,
21058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_OUT OMX_STRING componentName,
21068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_OUT OMX_VERSIONTYPE* componentVersion,
21078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_OUT OMX_VERSIONTYPE* specVersion,
21088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_OUT OMX_UUIDTYPE* componentUUID
21098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    )
21108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
2111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) hComp;
2112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) componentName;
2113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) componentVersion;
2114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) componentUUID;
21158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state == OMX_StateInvalid)
21168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
21178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State");
21188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidState;
21198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
21208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /* TBD -- Return the proper version */
21218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (specVersion)
21228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
21238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        specVersion->nVersion = OMX_SPEC_VERSION;
21248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
21258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
21268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
21278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
21288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
21298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::SendCommand
21308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
21318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
21328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanReturns zero if all the buffers released..
21338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
21348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
21358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
21368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
21378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
21388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
21398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
21408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
21418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
21428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      OMX_IN OMX_COMMANDTYPE cmd,
21438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      OMX_IN OMX_U32 param1,
21448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      OMX_IN OMX_PTR cmdData
21458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      )
21468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
2147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) hComp;
2148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) cmdData;
21498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command: Recieved a Command from Client");
21508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state == OMX_StateInvalid)
21518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
21528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State");
21538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidState;
21548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
21558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
21568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL)
21578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
21588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush "
21598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "to invalid port: %lu", param1);
21608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadPortIndex;
21618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
2162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    post_event((unsigned long)cmd,(unsigned long)param1,(unsigned long)OMX_COMPONENT_GENERATE_COMMAND);
21638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    sem_wait(&m_cmd_lock);
21648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command: Command Processed");
21658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
21668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
21678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
21688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
21698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
21708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::SendCommand
21718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
21728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
21738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanReturns zero if all the buffers released..
21748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
21758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
21768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
21778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
21788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
21798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
21808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
21818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
21828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
21838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            OMX_IN OMX_COMMANDTYPE cmd,
21848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            OMX_IN OMX_U32 param1,
21858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            OMX_IN OMX_PTR cmdData
21868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            )
21878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
2188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) hComp;
2189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) cmdData;
21908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
21918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
21928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int bFlag = 1,sem_posted = 0,ret=0;
21938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
21948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd);
21958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d",
21968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_state, eState);
21978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
21988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(cmd == OMX_CommandStateSet)
21998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
22008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued");
22018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState);
22028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /***************************/
22038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /* Current State is Loaded */
22048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /***************************/
22058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_state == OMX_StateLoaded)
22068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
22078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(eState == OMX_StateIdle)
22088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
22098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                //if all buffers are allocated or all ports disabled
22108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(allocate_done() ||
22118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE))
22128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
22138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (m_pSwVdec && SWVDEC_S_SUCCESS != SwVdec_Start(m_pSwVdec))
22148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
22158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("SWVDEC failed to start in allocate_done");
22168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return OMX_ErrorInvalidState;
22178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
22188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("SwVdec start successful: send_command_proxy(): Loaded-->Idle");
22198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
22208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
22218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
22228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending");
22238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
22248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    // Skip the event notification
22258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    bFlag = 0;
22268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
22278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
22288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Loaded to Loaded */
22298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateLoaded)
22308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
22318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded");
2232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                post_event((unsigned long)OMX_EventError,(unsigned long)OMX_ErrorSameState,\
2233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    (unsigned long)OMX_COMPONENT_GENERATE_EVENT);
22348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorSameState;
22358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
22368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Loaded to WaitForResources */
22378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateWaitForResources)
22388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
22398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                /* Since error is None , we will post an event
22408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                at the end of this function definition */
22418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources");
22428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
22438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Loaded to Executing */
22448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateExecuting)
22458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
22468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing");
2247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                post_event((unsigned long)OMX_EventError,(unsigned long)OMX_ErrorIncorrectStateTransition,\
2248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    (unsigned long)OMX_COMPONENT_GENERATE_EVENT);
22498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
22508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
22518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Loaded to Pause */
22528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StatePause)
22538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
22548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause");
2255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                post_event((unsigned long)OMX_EventError,(unsigned long)OMX_ErrorIncorrectStateTransition,\
2256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    (unsigned long)OMX_COMPONENT_GENERATE_EVENT);
22578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
22588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
22598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Loaded to Invalid */
22608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateInvalid)
22618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
22628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid");
2263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                post_event((unsigned long)OMX_EventError,(unsigned long)eState,(unsigned long)OMX_COMPONENT_GENERATE_EVENT);
22648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorInvalidState;
22658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
22668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
22678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
22688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\
22698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eState);
22708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadParameter;
22718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
22728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
22738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
22748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /***************************/
22758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /* Current State is IDLE */
22768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /***************************/
22778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if(m_state == OMX_StateIdle)
22788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
22798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(eState == OMX_StateLoaded)
22808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
22818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(release_done())
22828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
22838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    /*
22848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    Since error is None , we will post an event at the end
22858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    of this function definition
22868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    */
22878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (m_pSwVdec)
22888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
22898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        SwVdec_Stop(m_pSwVdec);
22908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
22918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded");
22928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
22938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
22948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
22958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending");
22968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
22978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    // Skip the event notification
22988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    bFlag = 0;
22998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
23008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
23018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Idle to Executing */
23028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateExecuting)
23038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
23048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
23058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
23068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bFlag = 1;
23078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
23088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_state=OMX_StateExecuting;
23098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
23108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
23118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    fill_all_buffers_proxy_dsp(hComp);
23128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
23138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful");
23148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
23158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Idle to Idle */
23168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateIdle)
23178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
23188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle");
2319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                post_event((unsigned long)OMX_EventError,(unsigned long)OMX_ErrorSameState,\
2320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    (unsigned long)OMX_COMPONENT_GENERATE_EVENT);
23218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorSameState;
23228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
23238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Idle to WaitForResources */
23248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateWaitForResources)
23258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
23268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources");
2327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                post_event((unsigned long)OMX_EventError,(unsigned long)OMX_ErrorIncorrectStateTransition,\
2328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    (unsigned long)OMX_COMPONENT_GENERATE_EVENT);
23298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
23308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
23318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Idle to Pause */
23328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StatePause)
23338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
23348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                /*To pause the Video core we need to start the driver*/
23358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
23368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    NULL) < */0)
23378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
23388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED");
23398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    omx_report_error ();
23408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet = OMX_ErrorHardware;
23418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
23428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
23438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
23448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
23458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause");
23468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    bFlag = 0;
23478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
23488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
23498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Idle to Invalid */
23508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateInvalid)
23518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
23528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid");
2353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                post_event((unsigned long)OMX_EventError,(unsigned long)eState,(unsigned long)OMX_COMPONENT_GENERATE_EVENT);
23548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorInvalidState;
23558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
23568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
23578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
23588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState);
23598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadParameter;
23608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
23618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
23628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
23638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /******************************/
23648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /* Current State is Executing */
23658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /******************************/
23668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if(m_state == OMX_StateExecuting)
23678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
23688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting");
23698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Executing to Idle */
23708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(eState == OMX_StateIdle)
23718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
23728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                /* Since error is None , we will post an event
23738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                at the end of this function definition
23748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                */
23758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle");
23768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
23778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(!sem_posted)
23788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
23798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    sem_posted = 1;
23808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    sem_post (&m_cmd_lock);
23818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    execute_omx_flush(OMX_ALL);
23828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
23838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bFlag = 0;
23848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
23858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Executing to Paused */
23868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StatePause)
23878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
23888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("PAUSE Command Issued");
23898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_state = OMX_StatePause;
23908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bFlag = 1;
23918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
23928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Executing to Loaded */
23938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateLoaded)
23948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
23958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded");
23968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
23978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
23988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
23998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Executing to WaitForResources */
24018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateWaitForResources)
24028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
24038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources");
24048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
24058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
24068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
24078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Executing to Executing */
24098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateExecuting)
24108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
24118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing");
24128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
24138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
24148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorSameState;
24158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Executing to Invalid */
24178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateInvalid)
24188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
24198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid");
24208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
24218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorInvalidState;
24228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
24248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
24258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState);
24268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadParameter;
24278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
24298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /***************************/
24308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /* Current State is Pause  */
24318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /***************************/
24328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if(m_state == OMX_StatePause)
24338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
24348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Pause to Executing */
24358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(eState == OMX_StateExecuting)
24368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
24378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pause --> Executing");
24388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_state = OMX_StateExecuting;
24398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
24408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
24418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    fill_all_buffers_proxy_dsp(hComp);
24428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
24438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bFlag = 1;
24448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Pause to Idle */
24468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateIdle)
24478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
24488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                /* Since error is None , we will post an event
24498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                at the end of this function definition */
24508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pause --> Idle");
24518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
24528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(!sem_posted)
24538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
24548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    sem_posted = 1;
24558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    sem_post (&m_cmd_lock);
24568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    execute_omx_flush(OMX_ALL);
24578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
24588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bFlag = 0;
24598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Pause to loaded */
24618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateLoaded)
24628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
24638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> loaded");
24648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
24658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
24668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
24678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Pause to WaitForResources */
24698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateWaitForResources)
24708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
24718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> WaitForResources");
24728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
24738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
24748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
24758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Pause to Pause */
24778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StatePause)
24788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
24798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> Pause");
24808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
24818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
24828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorSameState;
24838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from Pause to Invalid */
24858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateInvalid)
24868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
24878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> Invalid");
24888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
24898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorInvalidState;
24908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
24928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
24938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState);
24948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadParameter;
24958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
24978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /***************************/
24988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /* Current State is WaitForResources  */
24998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /***************************/
25008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if(m_state == OMX_StateWaitForResources)
25018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
25028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from WaitForResources to Loaded */
25038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(eState == OMX_StateLoaded)
25048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
25058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                /* Since error is None , we will post an event
25068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                at the end of this function definition */
25078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded");
25088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
25098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from WaitForResources to WaitForResources */
25108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if (eState == OMX_StateWaitForResources)
25118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
25128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources");
25138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,
25148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
25158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorSameState;
25168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
25178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from WaitForResources to Executing */
25188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateExecuting)
25198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
25208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing");
25218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
25228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
25238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
25248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
25258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from WaitForResources to Pause */
25268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StatePause)
25278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
25288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause");
25298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
25308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
25318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
25328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
25338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from WaitForResources to Invalid */
25348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(eState == OMX_StateInvalid)
25358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
25368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid");
25378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
25388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorInvalidState;
25398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
25408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Requesting transition from WaitForResources to Loaded -
25418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            is NOT tested by Khronos TS */
25428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
25438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
25448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
25458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
25468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState);
25478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorBadParameter;
25488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
25498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
25508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /********************************/
25518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /* Current State is Invalid */
25528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /*******************************/
25538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if(m_state == OMX_StateInvalid)
25548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
25558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /* State Transition from Inavlid to any state */
25568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(eState == (OMX_StateLoaded || OMX_StateWaitForResources
25578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            || OMX_StateIdle || OMX_StateExecuting
25588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            || OMX_StatePause || OMX_StateInvalid))
25598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
25608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded");
25618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            post_event(OMX_EventError,OMX_ErrorInvalidState,\
25628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
25638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorInvalidState;
25648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
25658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
25668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (cmd == OMX_CommandFlush)
25678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
25688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued"
25698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "with param1: %lu", param1);
25708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1)
25718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
25728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
25738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
25748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1)
25758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
25768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
25778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
25788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!sem_posted){
25798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sem_posted = 1;
25808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Set the Semaphore");
25818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sem_post (&m_cmd_lock);
25828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            execute_omx_flush(param1);
25838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
25848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bFlag = 0;
25858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
25868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if ( cmd == OMX_CommandPortEnable)
25878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
25888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued"
25898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "with param1: %lu", param1);
25908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
25918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
25928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_inp_bEnabled = OMX_TRUE;
25938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
25948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if( (m_state == OMX_StateLoaded &&
25958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
25968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                || allocate_input_done())
25978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
25988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
25998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
26008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
26018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
26028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
26038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
26048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
26058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Skip the event notification
26068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bFlag = 0;
26078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
26088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
26098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
26108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
26118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Enable output Port command recieved");
26128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_out_bEnabled = OMX_TRUE;
26138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if( (m_state == OMX_StateLoaded &&
26148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
26158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                || (allocate_output_done()))
26168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
26178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
26188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
26198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
26208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
26218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
26228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
26238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
26248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Skip the event notification
26258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bFlag = 0;
26268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
26278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
26288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
26298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (cmd == OMX_CommandPortDisable)
26308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
26318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued"
26328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "with param1: %lu", param1);
26338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
26348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
26358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_inp_bEnabled = OMX_FALSE;
26368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
26378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                && release_input_done())
26388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
26398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
26408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
26418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
26428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
26438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
26448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
26458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
26468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
26478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if(!sem_posted)
26488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
26498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        sem_posted = 1;
26508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        sem_post (&m_cmd_lock);
26518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
26528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
26538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
26548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
26558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Skip the event notification
26568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bFlag = 0;
26578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
26588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
26598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
26608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
26618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_out_bEnabled = OMX_FALSE;
26628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Disable output Port command recieved");
26638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
26648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                && release_output_done())
26658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
26668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
26678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
26688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
26698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
26708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
26718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
26728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
26738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
26748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (!sem_posted)
26758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
26768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        sem_posted = 1;
26778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        sem_post (&m_cmd_lock);
26788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
26798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
26808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
26818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
26828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Skip the event notification
26838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bFlag = 0;
26848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
26858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
26868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
26878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
26888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
26898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
26908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd);
26918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorNotImplemented;
26928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
26938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(eRet == OMX_ErrorNone && bFlag)
26948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
26958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
26968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
26978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!sem_posted)
26988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
26998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sem_post(&m_cmd_lock);
27008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
27018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
27028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
27038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
27048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
27058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
27068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
27078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::ExecuteOmxFlush
27088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
27098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
27108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanExecutes the OMX flush.
27118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
27128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
27138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanflushtype - input flush(1)/output flush(0)/ both.
27148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
27158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
27168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
27178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
27188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
27198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::execute_omx_flush(OMX_U32 flushType)
27208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
27218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = false;
27228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_plane plane;
27238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_buffer v4l2_buf;
27248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_decoder_cmd dec;
27258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("in %s flushType %d", __func__, (int)flushType);
27268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
27278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
27288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    switch (flushType)
27298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
27308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_CORE_INPUT_PORT_INDEX:
27318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input_flush_progress = true;
27328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT;
27338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
27348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_CORE_OUTPUT_PORT_INDEX:
27358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        output_flush_progress = true;
27368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
27378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
27388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
27398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_interm_flush_swvdec_progress = true;
27408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_interm_flush_dsp_progress = true;
27418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
27428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
27438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    default:
27448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input_flush_progress = true;
27458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        output_flush_progress = true;
27468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
27478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
27488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_interm_flush_swvdec_progress = true;
27498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_interm_flush_dsp_progress = true;
27508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
27518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT |
27528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
27538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
27548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
27558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!m_pSwVdec || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
27568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
27578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("flush dsp %d %d %d", dec.flags, V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT, V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE);
27588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
27598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
27608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Flush dsp Failed ");
27618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bRet = false;
27628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
27638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
27648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (flushType == OMX_CORE_INPUT_PORT_INDEX)
27658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
27668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // no input flush independently, wait for output flush
27678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return bRet;
27688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
27698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE)
27708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
27718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // for hybrid mode, swvdec flush will hapeen when dsp flush done is received
27728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        SWVDEC_BUFFER_FLUSH_TYPE aFlushType = SWVDEC_FLUSH_OUTPUT;
27738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_interm_flush_swvdec_progress  || input_flush_progress)
27748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
27758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            aFlushType = SWVDEC_FLUSH_ALL;
27768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
27778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Flush swvdec type %d", aFlushType);
27788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (SwVdec_Flush(m_pSwVdec, aFlushType) != SWVDEC_S_SUCCESS)
27798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
27808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Flush swvdec Failed ");
27818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
27828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Flush swvdec type %d successful", aFlushType);
27838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
27848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return bRet;
27858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
27868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/*=========================================================================
27878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION : execute_output_flush
27888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
27898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
27908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanExecutes the OMX flush at OUTPUT PORT.
27918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
27928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
27938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
27948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
27958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
27968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
27978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan==========================================================================*/
27988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::execute_output_flush()
27998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
2800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long p1 = 0; // Parameter - 1
2801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long p2 = 0; // Parameter - 2
2802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long ident = 0;
28038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = true;
28048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
28058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /*Generate FBD for all Buffers in the FTBq*/
28068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
28078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Initiate Output Flush");
28088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while (m_ftb_q.m_size)
28098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
28108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer queue size %d pending buf cnt %d",
28118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_ftb_q.m_size,pending_output_buffers);
28128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_ftb_q.pop_entry(&p1,&p2,&ident);
2813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_LOW("ID(%lx) P1(%lx) P2(%lx)", ident, p1, p2);
28148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(ident == m_fill_output_msg )
28158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
28168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
28178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
28188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if (ident == OMX_COMPONENT_GENERATE_FBD)
28198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
28208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
28218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
28228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
28238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
28248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    output_flush_progress = false;
28258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
28268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (arbitrary_bytes)
28278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
28288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        prev_ts = LLONG_MAX;
28298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rst_prev_ts = true;
28308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
28318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
28328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return bRet;
28338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
28348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/*=========================================================================
28358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION : execute_input_flush
28368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
28378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
28388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanExecutes the OMX flush at INPUT PORT.
28398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
28408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
28418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
28428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
28438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
28448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
28458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan==========================================================================*/
28468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::execute_input_flush()
28478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
2848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int i =0;
2849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long p1 = 0; // Parameter - 1
2850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long p2 = 0; // Parameter - 2
2851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long ident = 0;
28528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = true;
28538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
28548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /*Generate EBD for all Buffers in the ETBq*/
28558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Initiate Input Flush");
28568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
28578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
28588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Check if the Queue is empty");
28598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while (m_etb_q.m_size)
28608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
28618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_etb_q.pop_entry(&p1,&p2,&ident);
28628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
28638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
28648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
28658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
28668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
28678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
28688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if(ident == OMX_COMPONENT_GENERATE_ETB)
28698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
28708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pending_input_buffers++;
28718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
28728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
28738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
28748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
28758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if (ident == OMX_COMPONENT_GENERATE_EBD)
28768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
28778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p",
28788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_BUFFERHEADERTYPE *)p1);
28798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
28808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
28818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
28828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    time_stamp_dts.flush_timestamp();
28838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /*Check if Heap Buffers are to be flushed*/
28848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (arbitrary_bytes && !(codec_config_flag))
28858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
28868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Reset all the variables before flusing");
28878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        h264_scratch.nFilledLen = 0;
28888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nal_count = 0;
28898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        look_ahead_nal = false;
28908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frame_count = 0;
28918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        h264_last_au_ts = LLONG_MAX;
28928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        h264_last_au_flags = 0;
28938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
28948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_demux_entries = 0;
28958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Initialize parser");
28968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_frame_parser.mutils)
28978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
28988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_frame_parser.mutils->initialize_frame_checking_environment();
28998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
29008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
29018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        while (m_input_pending_q.m_size)
29028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
29038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_input_pending_q.pop_entry(&p1,&p2,&ident);
29048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
29058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
29068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
29078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (psource_frame)
29088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
29098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
29108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            psource_frame = NULL;
29118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
29128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
29138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pdest_frame)
29148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
29158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pdest_frame->nFilledLen = 0;
2916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned long)NULL,
2917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (unsigned long)NULL);
29188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pdest_frame = NULL;
29198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
29208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_frame_parser.flush();
29218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
29228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (codec_config_flag)
29238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
29248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
29258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "is not sent to the driver yet");
29268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
29278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
29288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    input_flush_progress = false;
29298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!arbitrary_bytes)
29308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
29318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        prev_ts = LLONG_MAX;
29328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rst_prev_ts = true;
29338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
29348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
29358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug_timestamp)
29368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
29378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_timestamp_list.reset_ts_list();
29388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
29398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
29408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
29418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return bRet;
29428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
29438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
29448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
29458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
29468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
29478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::SendCommandEvent
29488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
29498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
29508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanSend the event to decoder pipe.  This is needed to generate the callbacks
29518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanin decoder thread context.
29528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
29538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
29548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
29558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
29568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
29578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
29588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
29598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
2960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdec::post_event(unsigned long p1,
2961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                          unsigned long p2,
2962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                          unsigned long id)
29638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
29648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = false;
29658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE* bufHdr = NULL;
29668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
29678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
29688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
29698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (id == OMX_COMPONENT_GENERATE_FTB ||
29708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        id == OMX_COMPONENT_GENERATE_FBD)
29718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
29728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_ftb_q.insert_entry(p1,p2,id);
29738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
29748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (id == OMX_COMPONENT_GENERATE_ETB ||
29758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        id == OMX_COMPONENT_GENERATE_EBD ||
29768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY)
29778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
29788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_etb_q.insert_entry(p1,p2,id);
29798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
29808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (id == OMX_COMPONENT_GENERATE_FTB_DSP)
29818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
29828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr = (OMX_BUFFERHEADERTYPE*)p2;
29838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_ftb_q_dsp.insert_entry(p1,p2,id);
29848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
29858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (id == OMX_COMPONENT_GENERATE_ETB_SWVDEC)
29868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
29878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr = (OMX_BUFFERHEADERTYPE*)p2;
29888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_etb_q_swvdec.insert_entry(p1,p2,id);
29898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
29908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (id == OMX_COMPONENT_GENERATE_FBD_DSP)
29918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
29928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr = (OMX_BUFFERHEADERTYPE*)p1;
29938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_ftb_q_dsp.insert_entry(p1,p2,id);
29948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
29958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (id == OMX_COMPONENT_GENERATE_EBD_SWVDEC)
29968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
29978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr = (OMX_BUFFERHEADERTYPE*)p1;
29988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_etb_q_swvdec.insert_entry(p1,p2,id);
29998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
30008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
30018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
30028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_cmd_q.insert_entry(p1,p2,id);
30038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
30048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bRet = true;
30068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    post_message(this, id);
30078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
30088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return bRet;
30108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
30118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
30138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
30148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNoMore;
30158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!profileLevelType)
30168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
30178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(profileLevelType->nPortIndex == 0) {
30198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevchybrid",OMX_MAX_STRINGNAME_SIZE) ||
30208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevcswvdec",OMX_MAX_STRINGNAME_SIZE) ||
30218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE) )
30228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
30238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d",
30248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (int)profileLevelType->nProfileIndex);
30258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorNoMore;
30268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
30278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
30288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
30298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
30308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorNoMore;
30318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
30328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
30338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
30348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
30358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu", profileLevelType->nPortIndex);
30368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
30378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
30388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
30398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
30408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
30428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
30438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::GetParameter
30448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
30468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Get Parameter method implementation
30478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
30498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan<TBD>.
30508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
30528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanError None if successful.
30538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
30558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
30568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       OMX_IN OMX_INDEXTYPE paramIndex,
30578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       OMX_INOUT OMX_PTR     paramData)
30588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
3059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) hComp;
30608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
30618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_parameter:");
30638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state == OMX_StateInvalid)
30648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
30658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Param in Invalid State");
30668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidState;
30678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
30688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(paramData == NULL)
30698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
30708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Get Param in Invalid paramData");
30718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
30728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
30738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    switch((unsigned long)paramIndex)
30748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
30758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamPortDefinition:
30768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
30778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
30788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
30798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition");
30808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = update_portdef(portDefn);
30818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (eRet == OMX_ErrorNone)
30828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_port_def = *portDefn;
30838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
30848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
30858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamVideoInit:
30868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
30878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_PORT_PARAM_TYPE *portParamType =
30888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_PORT_PARAM_TYPE *) paramData;
30898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit");
30908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
30928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            portParamType->nSize = sizeof(portParamType);
30938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            portParamType->nPorts           = 2;
30948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            portParamType->nStartPortNumber = 0;
30958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
30968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
30978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamVideoPortFormat:
30988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
30998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
31008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
31018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat");
31028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
31038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
31048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            portFmt->nSize             = sizeof(portFmt);
31058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
31068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (0 == portFmt->nPortIndex)
31078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
31088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (0 == portFmt->nIndex)
31098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
31108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
31118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    portFmt->eCompressionFormat = eCompressionFormat;
31128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
31138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
31148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
31158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
31168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        " NoMore compression formats");
31178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet =  OMX_ErrorNoMore;
31188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
31198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
31208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if (1 == portFmt->nPortIndex)
31218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
31228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
31238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
31248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(0 == portFmt->nIndex)
31258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
31268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
31278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else if (1 == portFmt->nIndex)
31288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
31298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
31308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
31318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
31328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        " NoMore Color formats");
31338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet =  OMX_ErrorNoMore;
31348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
31358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
31368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
31378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
31388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("get_parameter: Bad port index %d",
31398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (int)portFmt->nPortIndex);
31408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadPortIndex;
31418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
31428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
31438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
31448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*Component should support this port definition*/
31458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamAudioInit:
31468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
31478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_PORT_PARAM_TYPE *audioPortParamType =
31488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_PORT_PARAM_TYPE *) paramData;
31498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit");
31508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
31518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            audioPortParamType->nSize = sizeof(audioPortParamType);
31528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            audioPortParamType->nPorts           = 0;
31538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            audioPortParamType->nStartPortNumber = 0;
31548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
31558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
31568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*Component should support this port definition*/
31578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamImageInit:
31588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
31598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_PORT_PARAM_TYPE *imagePortParamType =
31608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_PORT_PARAM_TYPE *) paramData;
31618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit");
31628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
31638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            imagePortParamType->nSize = sizeof(imagePortParamType);
31648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            imagePortParamType->nPorts           = 0;
31658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            imagePortParamType->nStartPortNumber = 0;
31668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
31678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
31688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
31698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*Component should support this port definition*/
31708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamOtherInit:
31718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
31728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x",
31738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                paramIndex);
31748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet =OMX_ErrorUnsupportedIndex;
31758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
31768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
31778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamStandardComponentRole:
31788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
31798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_PARAM_COMPONENTROLETYPE *comp_role;
31808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
31818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
31828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            comp_role->nSize = sizeof(*comp_role);
31838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
31848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d",
31858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                paramIndex);
31868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
31878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_MAX_STRINGNAME_SIZE);
31888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
31898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
31908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /* Added for parameter test */
31918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamPriorityMgmt:
31928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
31938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
31948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_PRIORITYMGMTTYPE *priorityMgmType =
31958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_PRIORITYMGMTTYPE *) paramData;
31968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt");
31978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
31988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            priorityMgmType->nSize = sizeof(priorityMgmType);
31998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
32008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
32018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
32028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /* Added for parameter test */
32038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamCompBufferSupplier:
32048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
32058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
32068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
32078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier");
32088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
32098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bufferSupplierType->nSize = sizeof(bufferSupplierType);
32108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
32118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(0 == bufferSupplierType->nPortIndex)
32128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
32138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if (1 == bufferSupplierType->nPortIndex)
32148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
32158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
32168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadPortIndex;
32178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
32188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
32198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
32208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
32218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamVideoAvc:
32228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
32238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x",
32248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                paramIndex);
32258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
32268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
32278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamVideoH263:
32288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
32298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x",
32308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                paramIndex);
32318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
32328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
32338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamVideoMpeg4:
32348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
32358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x",
32368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                paramIndex);
32378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
32388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
32398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamVideoMpeg2:
32408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
32418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x",
32428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                paramIndex);
32438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
32448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
32458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamVideoProfileLevelQuerySupported:
32468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
32478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex);
32488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
32498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
32508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = get_supported_profile_level_for_1080p(profileLevelType);
32518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
32528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
32538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
32548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
32558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
32568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage");
32578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
32588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
32598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
32608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(secure_mode) {
32618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
32628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        GRALLOC_USAGE_PRIVATE_UNCACHED);
32638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                } else {
32648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (!m_pSwVdec) {
32658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_
32668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
32678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else
3268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_UNCACHED;
32698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
32708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
32718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else {
32728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        // for swvdec use cached buffer
32738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage using output buffer cached");
3274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        // nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_UNCACHED;
3275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_SW_READ_OFTEN |
3276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                      GRALLOC_USAGE_SW_WRITE_OFTEN);
32778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
32788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("nativeBuffersUsage->nUsage %x", (unsigned int)nativeBuffersUsage->nUsage);
32798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
32808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
32818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!");
32828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadParameter;
32838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
32848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
32858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
32868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
32878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
32888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    default:
32898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
32908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex);
32918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet =OMX_ErrorUnsupportedIndex;
32928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
32938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
32948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
32958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
32968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)",
32978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.video_resolution.frame_width,
32988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.video_resolution.frame_height,
32998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.video_resolution.stride,
33008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.video_resolution.scan_lines);
33018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
33028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
33038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
33048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
33058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
33068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
33078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
33088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
33098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
33108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
33118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
33128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if((params == NULL) ||
33138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (params->nativeBuffer == NULL) ||
33148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (params->nativeBuffer->handle == NULL) ||
33158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        !m_enable_android_native_buffers)
33168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
33178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_use_android_native_buffers = OMX_TRUE;
33188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
33198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    private_handle_t *handle = (private_handle_t *)nBuf->handle;
33208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) {  //android native buffers can be used only on Output port
33218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_U8 *buffer = NULL;
33228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(!secure_mode) {
33238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer = (OMX_U8*)mmap(0, handle->size,
33248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
33258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(buffer == MAP_FAILED) {
33268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
33278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorInsufficientResources;
33288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
33298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
33308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
33318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else {
33328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorBadParameter;
33338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
33348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
33358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
33368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
33378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
33388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::enable_smoothstreaming() {
3339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (!m_pSwVdec || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
3340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        struct v4l2_control control;
3342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        struct v4l2_format fmt;
3343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
3344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        control.value = 1;
3345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
3346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (rc < 0) {
3347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
3348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            return OMX_ErrorHardware;
3349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE)
3352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        /* Full SW solution */
3354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_PROP prop;
3355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        prop.ePropId = SWVDEC_PROP_ID_SMOOTH_STREAMING;
3356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        prop.uProperty.sSmoothStreaming.bEnableSmoothStreaming = TRUE;
3357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (SwVdec_SetProperty(m_pSwVdec, &prop))
3358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_ERROR(
3360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                  "OMX_QcomIndexParamVideoAdaptivePlaybackMode not supported");
3361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            return OMX_ErrorUnsupportedSetting;
3362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
33638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
33648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Smooth Streaming enabled.");
33658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_smoothstreaming_mode = true;
33668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
33678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
33688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
33698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
33708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
33718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
33728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::Setparameter
33738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
33748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
33758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Set Parameter method implementation.
33768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
33778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
33788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan<TBD>.
33798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
33808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
33818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None if successful.
33828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
33838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
33848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
33858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       OMX_IN OMX_INDEXTYPE paramIndex,
33868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       OMX_IN OMX_PTR        paramData)
33878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
33888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
33898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int ret=0;
33908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_format fmt;
33918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state == OMX_StateInvalid)
33928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
33938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Set Param in Invalid State");
33948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidState;
33958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
33968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(paramData == NULL)
33978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
33988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Param in Invalid paramData");
33998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
34008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
34018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if((m_state != OMX_StateLoaded) &&
34028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
34038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (m_out_bEnabled == OMX_TRUE) &&
34048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
34058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (m_inp_bEnabled == OMX_TRUE)) {
34068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Set Param in Invalid State");
34078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorIncorrectStateOperation;
34088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
34098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    switch((unsigned long)paramIndex)
34108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
34118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamPortDefinition:
34128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
34138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
34148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
34158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
34168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            //been called.
34178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
34188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (int)portDefn->format.video.nFrameHeight,
34198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (int)portDefn->format.video.nFrameWidth);
34208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
34218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // for pure dsp mode, if the dimension exceeds 720p, reject it
34228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // so that the stagefright can try the hybrid component
34238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!m_pSwVdec &&
34248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (portDefn->format.video.nFrameHeight > 720 ||
34258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                portDefn->format.video.nFrameWidth > 1280))
34268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
34278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Full DSP mode only support up to 720p");
34288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorBadParameter;
34298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
34308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
34318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(OMX_DirOutput == portDefn->eDir)
34328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
34338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
34348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_display_id = portDefn->format.video.pNativeWindow;
34358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                unsigned int buffer_size;
3436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE) {
3437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    SWVDEC_PROP prop;
3438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    SWVDEC_STATUS sRet;
3439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    prop.ePropId = SWVDEC_PROP_ID_DIMENSIONS;
3440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    prop.uProperty.sDimensions.nWidth =
3441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               portDefn->format.video.nFrameWidth;
3442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    prop.uProperty.sDimensions.nHeight =
3443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               portDefn->format.video.nFrameHeight;
3444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    sRet = SwVdec_SetProperty(m_pSwVdec,&prop);
3445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    if(sRet!=SWVDEC_S_SUCCESS)
3446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    {
3447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        DEBUG_PRINT_ERROR("set_parameter: SwVdec_SetProperty():Failed to set dimensions to SwVdec in full SW");
3448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        return OMX_ErrorUnsupportedSetting;
3449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    }
3450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
34518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (!client_buffers.get_buffer_req(buffer_size)) {
34528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Error in getting buffer requirements");
34538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet = OMX_ErrorBadParameter;
34548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                } else {
34558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
34568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        portDefn->nBufferSize >=  drv_ctx.op_buf.buffer_size )
34578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
34588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
34598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
34608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = set_buffer_req_swvdec(&drv_ctx.op_buf);
34618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (eRet == OMX_ErrorNone)
34628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            m_port_def = *portDefn;
34638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
34648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else
34658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
34668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)",
34678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
34688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            portDefn->nBufferCountActual, portDefn->nBufferSize);
34698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = OMX_ErrorBadParameter;
34708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
34718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
34728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
34738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if(OMX_DirInput == portDefn->eDir)
34748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
34758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bool port_format_changed = false;
34768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if((portDefn->format.video.xFramerate >> 16) > 0 &&
34778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS)
34788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
34798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    // Frame rate only should be set if this is a "known value" or to
34808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    // activate ts prediction logic (arbitrary mode only) sending input
34818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    // timestamps with max value (LLONG_MAX).
34828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu",
34838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        portDefn->format.video.xFramerate >> 16);
34848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
34858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        drv_ctx.frame_rate.fps_denominator);
34868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if(!drv_ctx.frame_rate.fps_numerator)
34878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
34888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
34898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        drv_ctx.frame_rate.fps_numerator = 30;
34908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
34918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if(drv_ctx.frame_rate.fps_denominator)
34928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        drv_ctx.frame_rate.fps_numerator = (int)
34938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
34948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.frame_rate.fps_denominator = 1;
34958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
34968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        drv_ctx.frame_rate.fps_numerator;
34978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
34988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator /
34998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (float)drv_ctx.frame_rate.fps_denominator);
35008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
35018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
35028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(drv_ctx.video_resolution.frame_height !=
35038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    portDefn->format.video.nFrameHeight ||
35048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.video_resolution.frame_width  !=
35058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    portDefn->format.video.nFrameWidth)
35068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
35078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("SetParam IP: WxH(%d x %d)",
35088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (int)portDefn->format.video.nFrameWidth,
35098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (int)portDefn->format.video.nFrameHeight);
35108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    port_format_changed = true;
35118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_U32 frameWidth = portDefn->format.video.nFrameWidth;
35128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_U32 frameHeight = portDefn->format.video.nFrameHeight;
35138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (frameHeight != 0x0 && frameWidth != 0x0)
35148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
35158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                       if (m_smoothstreaming_mode &&
35168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                ((frameWidth * frameHeight) <
35178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                (m_smoothstreaming_width * m_smoothstreaming_height))) {
35188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            frameWidth = m_smoothstreaming_width;
35198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            frameHeight = m_smoothstreaming_height;
35208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("NOTE: Setting resolution %lu x %lu for adaptive-playback/smooth-streaming",
35218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                   frameWidth, frameHeight);
35228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
35238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        update_resolution(frameWidth, frameHeight,
35248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                frameWidth, frameHeight);
3525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        if (m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE)
3526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        {
3527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            /* update the stride info */
3528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            drv_ctx.video_resolution.stride =
3529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               (frameWidth + DEFAULT_WIDTH_ALIGNMENT - 1) & (~(DEFAULT_WIDTH_ALIGNMENT - 1));
3530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            drv_ctx.video_resolution.scan_lines =
3531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               (frameHeight + DEFAULT_HEIGHT_ALIGNMENT - 1) & (~(DEFAULT_HEIGHT_ALIGNMENT - 1));
3532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        }
35338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
35348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = is_video_session_supported();
35358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (eRet)
35368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            break;
35378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (!m_pSwVdec || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
35388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
35398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
35408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
35418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
35428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            fmt.fmt.pix_mp.pixelformat = output_capability;
35438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",
35448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
35458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
35468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if (ret)
35478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            {
35488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("Set Resolution failed h %d w %d", fmt.fmt.pix_mp.height, fmt.fmt.pix_mp.width);
35498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                eRet = OMX_ErrorUnsupportedSetting;
35508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                break;
35518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
35528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
35538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (m_pSwVdec)
35548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        {
35558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            SWVDEC_PROP prop;
35568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            prop.ePropId = SWVDEC_PROP_ID_DIMENSIONS;
3557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            prop.uProperty.sDimensions.nWidth = drv_ctx.video_resolution.frame_width;
3558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            prop.uProperty.sDimensions.nHeight= drv_ctx.video_resolution.frame_height;
35598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            SwVdec_SetProperty(m_pSwVdec,&prop);
35608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            prop.ePropId = SWVDEC_PROP_ID_FRAME_ATTR;
35618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            prop.uProperty.sFrameAttr.eColorFormat = SWVDEC_FORMAT_NV12;
35628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            ret = SwVdec_SetProperty(m_pSwVdec,&prop);
35638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if (ret) {
35648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("Failed to set color fmt to SwVdec in full SW");
35658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                return OMX_ErrorInsufficientResources;
35668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
35678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
35688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = get_buffer_req_swvdec();
35698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
35708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
35718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
35728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size)
35738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
35748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    port_format_changed = true;
35758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
35768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
35778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
35788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (~(buffer_prop->alignment - 1));
35798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("IP Requirements(#%d: %u) Requested(#%lu: %lu)",
35808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
35818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        portDefn->nBufferCountActual, portDefn->nBufferSize);
35828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (!m_pSwVdec || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
35838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                       eRet = set_buffer_req(buffer_prop);
35848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
35858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (!port_format_changed)
35868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
35878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)",
35888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
35898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        portDefn->nBufferCountActual, portDefn->nBufferSize);
35908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet = OMX_ErrorBadParameter;
35918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
35928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
35938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if (portDefn->eDir ==  OMX_DirMax)
35948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
35958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
35968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (int)portDefn->nPortIndex);
35978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadPortIndex;
35988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
35998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
36008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
36018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamVideoPortFormat:
36028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
36038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
36048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
36058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            int ret=0;
36068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            struct v4l2_format fmt;
36078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d",
36088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                portFmt->eColorFormat);
36098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
36108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(1 == portFmt->nPortIndex)
36118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
36128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
36138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
36148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
36158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                fmt.fmt.pix_mp.pixelformat = capture_capability;
36168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                enum vdec_output_fromat op_format;
36178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
36188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) ||
36198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar))
36208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
36218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else if(portFmt->eColorFormat ==
36228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (OMX_COLOR_FORMATTYPE)
36238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
36248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    op_format = VDEC_YUV_FORMAT_TILE_4x2;
36258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
36268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet = OMX_ErrorBadParameter;
36278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
36288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(eRet == OMX_ErrorNone)
36298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
36308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.output_format = op_format;
36318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (!m_pSwVdec)
36328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
36338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
36348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
36358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else if ((m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE) ||
36368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                             (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY))
36378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
36388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        SWVDEC_PROP prop;
36398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        prop.ePropId = SWVDEC_PROP_ID_DIMENSIONS;
36408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        prop.uProperty.sDimensions.nWidth = fmt.fmt.pix_mp.width;
36418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        prop.uProperty.sDimensions.nHeight= fmt.fmt.pix_mp.height;
36428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        SwVdec_SetProperty(m_pSwVdec,&prop);
36438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        prop.ePropId = SWVDEC_PROP_ID_FRAME_ATTR;
36448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        prop.uProperty.sFrameAttr.eColorFormat = SWVDEC_FORMAT_NV12;
36458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        SwVdec_SetProperty(m_pSwVdec,&prop);
36468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
36478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    // need to set output format to swvdec
36488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if(ret)
36498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
36508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Set output format failed");
36518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
36528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        /*TODO: How to handle this case */
36538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
36548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else
36558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
36568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = get_buffer_req_swvdec();
36578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
36588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
36598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (eRet == OMX_ErrorNone){
36608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
36618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Set color format failed");
36628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = OMX_ErrorBadParameter;
36638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
36648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
36658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
36668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
36678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
36688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
36698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexPortDefn:
36708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
36718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
36728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
36738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d",
36748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (int)portFmt->nFramePackingFormat);
36758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
36768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Input port */
36778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (portFmt->nPortIndex == 0)
36788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
36798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary)
36808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
36818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if(secure_mode) {
36828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        arbitrary_bytes = false;
36838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
36848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
36858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    } else {
36868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        arbitrary_bytes = true;
36878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
36888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
36898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else if (portFmt->nFramePackingFormat ==
36908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_QCOM_FramePacking_OnlyOneCompleteFrame)
36918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
36928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    arbitrary_bytes = false;
36938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
36948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
36958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
36968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu",
36978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        portFmt->nFramePackingFormat);
36988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
36998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
37008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
37018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX)
37028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
37038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port");
37048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
37058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
37068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone)
37078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
37088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    m_out_mem_region_smi = OMX_TRUE;
37098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
37108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
37118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set");
37128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        m_use_output_pmem = OMX_TRUE;
37138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
37148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
37158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
37168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
37178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
37188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
37198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamStandardComponentRole:
37208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
37218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_PARAM_COMPONENTROLETYPE *comp_role;
37228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
37238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
37248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                comp_role->cRole);
37258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
37268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if((m_state == OMX_StateLoaded)&&
37278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
37288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
37298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Set Parameter called in valid state");
37308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
37318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
37328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
37338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
37348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorIncorrectStateOperation;
37358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
37368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
37378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevchybrid",OMX_MAX_STRINGNAME_SIZE) ||
37388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevcswvdec",OMX_MAX_STRINGNAME_SIZE) ||
37398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE))
37408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
37418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(!strncmp((char*)comp_role->cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE))
37428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
37438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    strlcpy((char*)m_cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
37448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
37458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
37468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
37478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
37488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet =OMX_ErrorUnsupportedSetting;
37498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
37508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
37518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
37528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
37538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind);
37548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorInvalidComponentName;
37558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
37568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
37578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
37588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
37598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamPriorityMgmt:
37608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
37618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(m_state != OMX_StateLoaded)
37628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
37638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
37648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorIncorrectStateOperation;
37658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
37668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
37678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d",
37688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (int)priorityMgmtype->nGroupID);
37698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
37708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d",
37718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (int)priorityMgmtype->nGroupPriority);
37728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
37738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
37748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
37758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
37768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
37778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
37788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
37798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamCompBufferSupplier:
37808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
37818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
37828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
37838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufferSupplierType->eBufferSupplier);
37848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
37858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
37868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
37878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
37888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
37898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadPortIndex;
37908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
37918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
37928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
37938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
37948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamVideoAvc:
37958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamVideoH263:
37968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamVideoMpeg4:
37978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexParamVideoMpeg2:
37988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
37998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorUnsupportedSetting;
38008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
38018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
38028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexParamVideoDecoderPictureOrder:
38038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
38048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
38058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
38068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            struct v4l2_control control;
38078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            int pic_order,rc=0;
38088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d",
38098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pictureOrder->eOutputPictureOrder);
38108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
38118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
38128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
38138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER){
38148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
38158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                time_stamp_dts.set_timestamp_reorder_mode(false);
38168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
38178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
38188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadParameter;
38198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (eRet == OMX_ErrorNone)
38208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
38218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (!m_pSwVdec || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY) {
38228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
38238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    control.value = pic_order;
38248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
38258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if(rc)
38268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
38278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Set picture order failed");
38288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
38298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
38308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
38318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // if (m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE)
38328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
38338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    // TODO
38348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
38358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
38368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
38378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
38388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexParamConcealMBMapExtraData:
38398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(!secure_mode)
38408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
38418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ((QOMX_ENABLETYPE *)paramData)->bEnable);
38428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else {
38438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("secure mode setting not supported");
38448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorUnsupportedSetting;
38458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
38468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
38478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexParamFrameInfoExtraData:
38488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
38498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(!secure_mode)
38508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
38518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                ((QOMX_ENABLETYPE *)paramData)->bEnable);
38528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else {
38538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("secure mode setting not supported");
38548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
38558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
38568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
38578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
38588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexParamInterlaceExtraData:
38598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(!secure_mode)
38608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
38618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ((QOMX_ENABLETYPE *)paramData)->bEnable);
38628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else {
38638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("secure mode setting not supported");
38648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorUnsupportedSetting;
38658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
38668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
38678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexParamH264TimeInfo:
38688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(!secure_mode)
38698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
38708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ((QOMX_ENABLETYPE *)paramData)->bEnable);
38718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else {
38728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("secure mode setting not supported");
38738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorUnsupportedSetting;
38748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
38758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
38768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexParamVideoDivx:
38778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
38788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
38798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
38808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
38818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexPlatformPvt:
38828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
38838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port");
38848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
38858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM)
38868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
38878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
38888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
38898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
38908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
38918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
38928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_out_pvt_entry_pmem = OMX_TRUE;
38938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if ((m_out_mem_region_smi && m_out_pvt_entry_pmem))
38948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
38958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set");
38968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    m_use_output_pmem = OMX_TRUE;
38978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
38988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
38998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
39008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
39018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
39028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
39038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
39048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!m_pSwVdec || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY) {
39058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
39068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
39078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                struct v4l2_control control;
39088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                int rc;
39098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.idr_only_decoding = 1;
39108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
39118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
39128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
39138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(rc)
39148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
39158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Set picture order failed");
39168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
39178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                } else {
39188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
39198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
39208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
39218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if(rc)
39228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
39238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Sync frame setting failed");
39248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
39258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
39268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    /* Setting sync frame decoding on driver might change
39278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                     * buffer requirements so update them here*/
39288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (get_buffer_req(&drv_ctx.ip_buf)) {
39298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer i/p requirements");
39308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
39318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
39328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (!m_pSwVdec) { // for full dsp mode
39338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (get_buffer_req(&drv_ctx.op_buf)) {
39348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer o/p requirements");
39358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            eRet = OMX_ErrorUnsupportedSetting;
39368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
39378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    } else if (get_buffer_req(&drv_ctx.interm_op_buf)) { // for hybrid
39388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer o/p requirements");
39398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
39408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
39418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
39428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
39438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
39448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
39458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
39468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexParamIndexExtraDataType:
39478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
39488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(!secure_mode) {
39498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
39508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
39518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (extradataIndexType->bEnabled == OMX_TRUE) &&
39528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (extradataIndexType->nPortIndex == 1))
39538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
39548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
39558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
39568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
39578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
39588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
39598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
39608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
39618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexParamEnableSmoothStreaming:
39628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
39638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifndef SMOOTH_STREAMING_DISABLED
39648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!m_pSwVdec || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY) {
39658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = enable_smoothstreaming();
39668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
39678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else
39688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorUnsupportedSetting;
39698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
39708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
39718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
39728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
39738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /* Need to allow following two set_parameters even in Idle
39748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        * state. This is ANDROID architecture which is not in sync
39758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        * with openmax standard. */
39768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
39778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
39788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
39798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(enableNativeBuffers) {
39808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_enable_android_native_buffers = enableNativeBuffers->enable;
39818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
39828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
39838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
39848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
39858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
39868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = use_android_native_buffer(hComp, paramData);
39878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
39888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
39898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
39908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexParamEnableTimeStampReorder:
39918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
39928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
39938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
39948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (reorder->bEnable == OMX_TRUE) {
39958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    frm_int =0;
39968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    time_stamp_dts.set_timestamp_reorder_mode(true);
39978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
39988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
39998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    time_stamp_dts.set_timestamp_reorder_mode(false);
40008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
40018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                time_stamp_dts.set_timestamp_reorder_mode(false);
40028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (reorder->bEnable == OMX_TRUE)
40038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
40048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
40058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
40068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
40078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
40088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
40098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexParamVideoMetaBufferMode:
40108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
4011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoMetaBufferMode");
4012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_disable_dynamic_buf_mode) {
4013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_HIGH("Dynamic buffer mode disabled by setprop");
4014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                eRet = OMX_ErrorUnsupportedSetting;
4015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
4016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
40178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            StoreMetaDataInBuffersParams *metabuffer =
40188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (StoreMetaDataInBuffersParams *)paramData;
40198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!metabuffer) {
40208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Invalid param: %p", metabuffer);
40218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadParameter;
40228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
40238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
40248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (metabuffer->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
40258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (m_pSwVdec == NULL) {
40268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    //set property dynamic buffer mode to driver.
40278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    struct v4l2_control control;
40288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    struct v4l2_format fmt;
40298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_ALLOC_MODE_OUTPUT;
40308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (metabuffer->bStoreMetaData == true) {
40318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        control.value = V4L2_MPEG_VIDC_VIDEO_DYNAMIC;
40328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    } else {
40338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        control.value = V4L2_MPEG_VIDC_VIDEO_STATIC;
40348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
40358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
40368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (!rc) {
40378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH(" %s buffer mode",
40388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           (metabuffer->bStoreMetaData == true)? "Enabled dynamic" : "Disabled dynamic");
40398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               dynamic_buf_mode = metabuffer->bStoreMetaData;
40408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    } else {
40418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Failed to %s buffer mode",
40428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           (metabuffer->bStoreMetaData == true)? "enable dynamic" : "disable dynamic");
40438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        dynamic_buf_mode = false;
40448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
40458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
40468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                } else { // for hybrid codec
40478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH(" %s buffer mode",
40488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                       (metabuffer->bStoreMetaData == true)? "Enabled dynamic" : "Disabled dynamic");
40498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    dynamic_buf_mode = metabuffer->bStoreMetaData;
40508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (dynamic_buf_mode) {
40518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        SWVDEC_PROP prop;
40528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        prop.ePropId = SWVDEC_PROP_ID_BUFFER_ALLOC_MODE;
40538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        prop.uProperty.sBufAllocMode.eBufAllocMode = SWVDEC_BUF_ALLOC_MODE_DYNAMIC;
4054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        if (SwVdec_SetProperty(m_pSwVdec, &prop))
4055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        {
4056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            DEBUG_PRINT_ERROR(
4057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  "OMX_QcomIndexParamVideoMetaBufferMode not supported for port: %lu",
4058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  metabuffer->nPortIndex);
4059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            eRet = OMX_ErrorUnsupportedSetting;
4060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        }
4061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        else
4062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        {
4063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            DEBUG_PRINT_LOW(
4064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  "OMX_QcomIndexParamVideoMetaBufferMode supported for port: %lu",
4065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  metabuffer->nPortIndex);
4066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        }
40678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
40688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
40698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
40708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR(
40718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                   "OMX_QcomIndexParamVideoMetaBufferMode not supported for port: %lu",
40728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                   metabuffer->nPortIndex);
40738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
40748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
40758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
40768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
40778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
40788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case OMX_QcomIndexParamVideoAdaptivePlaybackMode:
40798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
4080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("set_parameter: OMX_GoogleAndroidIndexPrepareForAdaptivePlayback");
4081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            PrepareForAdaptivePlaybackParams* pParams =
4082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    (PrepareForAdaptivePlaybackParams *) paramData;
4083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (pParams->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
4084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (!pParams->bEnable) {
4085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    return OMX_ErrorNone;
4086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
4087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (pParams->nMaxFrameWidth > maxSmoothStreamingWidth
4088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        || pParams->nMaxFrameHeight > maxSmoothStreamingHeight) {
4089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_ERROR(
4090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            "Adaptive playback request exceeds max supported resolution : [%lu x %lu] vs [%lu x %lu]",
4091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             pParams->nMaxFrameWidth,  pParams->nMaxFrameHeight,
4092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            maxSmoothStreamingWidth, maxSmoothStreamingHeight);
4093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    eRet = OMX_ErrorBadParameter;
4094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                } else
4095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
4096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     eRet = enable_smoothstreaming();
4097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     if (eRet != OMX_ErrorNone) {
4098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         DEBUG_PRINT_ERROR("Failed to enable Adaptive Playback on driver.");
4099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         eRet = OMX_ErrorHardware;
4100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     } else  {
4101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         DEBUG_PRINT_HIGH("Enabling Adaptive playback for %lu x %lu",
4102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 pParams->nMaxFrameWidth, pParams->nMaxFrameHeight);
4103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         m_smoothstreaming_mode = true;
4104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         m_smoothstreaming_width = pParams->nMaxFrameWidth;
4105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         m_smoothstreaming_height = pParams->nMaxFrameHeight;
4106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     }
4107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     struct v4l2_format fmt;
4108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     update_resolution(m_smoothstreaming_width, m_smoothstreaming_height,
4109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                  m_smoothstreaming_width, m_smoothstreaming_height);
4110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     if (!m_pSwVdec || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
4111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     {
4112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
4113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
4114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
4115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         fmt.fmt.pix_mp.pixelformat = output_capability;
4116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",
4117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                     fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
4118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
4119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         if (ret) {
4120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             DEBUG_PRINT_ERROR("Set Resolution failed");
4121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             eRet = OMX_ErrorUnsupportedSetting;
4122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         } else
4123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             eRet = get_buffer_req(&drv_ctx.op_buf);
4124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     }
4125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     else if (SWVDEC_MODE_PARSE_DECODE == m_swvdec_mode)
4126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     {
4127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         SWVDEC_PROP prop;
4128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         SWVDEC_STATUS sRet;
4129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         /* set QCIF resolution to get UpperLimit_bufferCount */
4130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         prop.ePropId = SWVDEC_PROP_ID_DIMENSIONS;
4131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         prop.uProperty.sDimensions.nWidth = 176;
4132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         prop.uProperty.sDimensions.nHeight= 144;
4133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         sRet = SwVdec_SetProperty(m_pSwVdec,&prop);
4134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         if (SWVDEC_S_SUCCESS != sRet)
4135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         {
4136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             DEBUG_PRINT_ERROR("SwVdec_SetProperty failed (%d)", sRet);
4137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             eRet = OMX_ErrorUndefined;
4138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             break;
4139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         }
4140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         prop.ePropId = SWVDEC_PROP_ID_OPBUFFREQ;
4142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         sRet = SwVdec_GetProperty(m_pSwVdec, &prop);
4143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         if (SWVDEC_S_SUCCESS == sRet)
4144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         {
4145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             drv_ctx.op_buf.actualcount = prop.uProperty.sOpBuffReq.nMinCount;
4146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             drv_ctx.op_buf.mincount = prop.uProperty.sOpBuffReq.nMinCount;
4147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         }
4148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         else
4149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         {
4150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             DEBUG_PRINT_ERROR("SwVdec_GetProperty failed (%d)", sRet);
4151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             eRet = OMX_ErrorUndefined;
4152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             break;
4153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         }
4154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         /* set the max smooth-streaming resolution to get the buffer size */
4156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         prop.ePropId = SWVDEC_PROP_ID_DIMENSIONS;
4157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         prop.uProperty.sDimensions.nWidth = m_smoothstreaming_width;
4158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         prop.uProperty.sDimensions.nHeight= m_smoothstreaming_height;
4159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         SwVdec_SetProperty(m_pSwVdec,&prop);
4160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         if (SWVDEC_S_SUCCESS != sRet)
4161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         {
4162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             DEBUG_PRINT_ERROR("SwVdec_SetProperty failed (%d)", sRet);
4163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             eRet = OMX_ErrorUndefined;
4164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             break;
4165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         }
4166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         prop.ePropId = SWVDEC_PROP_ID_OPBUFFREQ;
4168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         sRet = SwVdec_GetProperty(m_pSwVdec, &prop);
4169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         if (SWVDEC_S_SUCCESS == sRet)
4170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         {
4171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             int client_extra_data_size = 0;
4172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
4173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             {
4174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 DEBUG_PRINT_HIGH("Frame info extra data enabled!");
4175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
4176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             }
4177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             if (client_extradata & OMX_INTERLACE_EXTRADATA)
4178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             {
4179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 DEBUG_PRINT_HIGH("OMX_INTERLACE_EXTRADATA!");
4180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
4181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             }
4182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             if (client_extradata & OMX_PORTDEF_EXTRADATA)
4183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             {
4184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
4185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d",
4186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       client_extra_data_size);
4187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             }
4188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             if (client_extra_data_size)
4189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             {
4190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
4191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             }
4192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             drv_ctx.op_buf.buffer_size = prop.uProperty.sOpBuffReq.nSize + client_extra_data_size;
4193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         }
4194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         else
4195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         {
4196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           DEBUG_PRINT_ERROR("SwVdec_GetProperty failed (%d)", sRet);
4197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           eRet = OMX_ErrorUndefined;
4198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           break;
4199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         }
4200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         /* set the buffer requirement to sw vdec */
4202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         prop.uProperty.sOpBuffReq.nSize = drv_ctx.op_buf.buffer_size;
4203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         prop.uProperty.sOpBuffReq.nMaxCount = drv_ctx.op_buf.actualcount;
4204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         prop.uProperty.sOpBuffReq.nMinCount = drv_ctx.op_buf.mincount;
4205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         prop.ePropId = SWVDEC_PROP_ID_OPBUFFREQ;
4207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         sRet = SwVdec_SetProperty(m_pSwVdec, &prop);
4208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         if (SWVDEC_S_SUCCESS != sRet)
4209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         {
4210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           DEBUG_PRINT_ERROR("SwVdec_SetProperty failed (%d)", sRet);
4211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           eRet = OMX_ErrorUndefined;
4212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           break;
4213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         }
4214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     }
4215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 }
4216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
4218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
4219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_ERROR(
4220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        "Prepare for adaptive playback supported only on output port");
4221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                eRet = OMX_ErrorBadParameter;
4222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
42248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
42258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
42268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    default:
42278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
42288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex);
42298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorUnsupportedIndex;
42308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
42318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
42328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
42338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
42348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
42358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
42368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
42378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::GetConfig
42388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
42398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
42408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Get Config Method implementation.
42418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
42428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
42438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan<TBD>.
42448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
42458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
42468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None if successful.
42478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
42488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
42498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
42508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_IN OMX_INDEXTYPE configIndex,
42518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_INOUT OMX_PTR     configData)
42528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
4253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) hComp;
42548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
42558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
42568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_state == OMX_StateInvalid)
42578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
42588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Config in Invalid State");
42598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidState;
42608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
42618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
42628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    switch ((unsigned long)configIndex)
42638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
42648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexConfigInterlaced:
42658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
42668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
42678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
42688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (configFmt->nPortIndex == 1)
42698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
42708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (configFmt->nIndex == 0)
42718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
42728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
42738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
42748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else if (configFmt->nIndex == 1)
42758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
42768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    configFmt->eInterlaceType =
42778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
42788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
42798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else if (configFmt->nIndex == 2)
42808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
42818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    configFmt->eInterlaceType =
42828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
42838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
42848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
42858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
42868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
42878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        " NoMore Interlaced formats");
42888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet = OMX_ErrorNoMore;
42898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
42908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
42918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
42928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
42938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
42948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port",
42958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (int)configFmt->nPortIndex);
42968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadPortIndex;
42978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
42988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
42998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
43008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexQueryNumberOfVideoDecInstance:
43018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
43028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
43038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
43048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            decoderinstances->nNumOfInstances = 16;
43058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /*TODO: How to handle this case */
43068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
43078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
43088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_QcomIndexConfigVideoFramePackingArrangement:
43098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
43108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
43118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
43128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
43138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case OMX_IndexConfigCommonOutputCrop:
43148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
43158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
43168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
43178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
43188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
43198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    default:
43208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
43218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex);
43228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorBadParameter;
43238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
43248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
43268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
43288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
43298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
43318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
43328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::SetConfig
43338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
43358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Set Config method implementation
43368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
43388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan<TBD>.
43398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
43418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None if successful.
43428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
43438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
43448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_IN OMX_INDEXTYPE configIndex,
43458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_IN OMX_PTR        configData)
43468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
4347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) hComp;
43488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state == OMX_StateInvalid)
43498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
43508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Config in Invalid State");
43518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidState;
43528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
43538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
43558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_VIDEO_CONFIG_NALSIZE *pNal;
43568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Set Config Called");
43588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_state == OMX_StateExecuting)
43608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
43618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("set_config:Ignore in Exe state");
43628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return ret;
43638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
43648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData)
43668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
43678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
43688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData called");
43698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return ret;
43708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
43718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (configIndex == OMX_IndexConfigVideoNalSize)
43728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
43738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
43758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nal_length = pNal->nNaluBytes;
43768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
43778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
43788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return ret;
43798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
43808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNotImplemented;
43818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
43828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
43848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
43858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::GetExtensionIndex
43868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
43888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX GetExtensionIndex method implementaion.  <TBD>
43898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
43918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan<TBD>.
43928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
43948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None if everything successful.
43958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
43968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
43978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
43988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                             OMX_IN OMX_STRING      paramName,
43998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                             OMX_OUT OMX_INDEXTYPE* indexType)
44008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
4401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) hComp;
44028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state == OMX_StateInvalid)
44038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
44048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State");
44058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidState;
44068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
44078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
44088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
44098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
44108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1))
44118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
44128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
44138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
44148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
44158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if(!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
44168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
44178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
44188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
44198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
44208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
44218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if(!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
44228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extension: %s is supported", paramName);
44238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
44248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
44258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if(!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
44268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
44278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
44288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
44298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (!strncmp(paramName, "OMX.google.android.index.storeMetaDataInBuffers", sizeof("OMX.google.android.index.storeMetaDataInBuffers") - 1)) {
44308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoMetaBufferMode;
44318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
44328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#if ADAPTIVE_PLAYBACK_SUPPORTED
44338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (!strncmp(paramName, "OMX.google.android.index.prepareForAdaptivePlayback", sizeof("OMX.google.android.index.prepareForAdaptivePlayback") -1)) {
44348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoAdaptivePlaybackMode;
44358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
44368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
44378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else {
44388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName);
44398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorNotImplemented;
44408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
44418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
44428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
44438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
44458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
44468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::GetState
44478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
44498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanReturns the state information back to the caller.<TBD>
44508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
44528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan<TBD>.
44538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
44558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanError None if everything is successful.
44568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
44578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
44588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                   OMX_OUT OMX_STATETYPE* state)
44598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
4460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) hComp;
44618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    *state = m_state;
44628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_state: Returning the state %d",*state);
44638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
44648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
44658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
44678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
44688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::ComponentTunnelRequest
44698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
44718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Component Tunnel Request method implementation. <TBD>
44728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
44748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
44758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
44778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None if everything successful.
44788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
44808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
44818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                  OMX_IN OMX_U32                        port,
44828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                  OMX_IN OMX_HANDLETYPE        peerComponent,
44838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                  OMX_IN OMX_U32                    peerPort,
44848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                  OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
44858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
4486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) hComp;
4487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) port;
4488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) peerComponent;
4489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) peerPort;
4490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) tunnelSetup;
44918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented");
44928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNotImplemented;
44938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
44948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
44968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
44978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::UseOutputBuffer
44988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
45008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanHelper function for Use buffer in the input pin
45018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
45028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
45038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
45048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
45058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
45068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
45078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
45088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
45098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::allocate_extradata()
45108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
45118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
45128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.extradata_info.buffer_size) {
45138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
45148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
45158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
45168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            free_ion_memory(&drv_ctx.extradata_info.ion);
45178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
45188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
45198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("allocate extradata memory size %d", drv_ctx.extradata_info.size);
45208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int heap = 0;
45218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_
45228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        heap = ION_ADSP_HEAP_ID;
4523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else
4524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        heap = ION_IOMMU_HEAP_ID;
45258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
45268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
45278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.extradata_info.size, 4096,
45288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            &drv_ctx.extradata_info.ion.ion_alloc_data,
45298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            &drv_ctx.extradata_info.ion.fd_ion_data, 0, heap);
45308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
45318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to alloc extradata memory");
45328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
45338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
45348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
45358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.extradata_info.size,
45368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            PROT_READ|PROT_WRITE, MAP_SHARED,
45378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
45388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
45398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to map extradata memory");
45408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
45418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            free_ion_memory(&drv_ctx.extradata_info.ion);
45428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
45438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
45448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset(drv_ctx.extradata_info.uaddr, 0, drv_ctx.extradata_info.size);
45458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
45468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
45478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
45488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
45498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
45508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::free_extradata() {
45518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
45528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.extradata_info.uaddr) {
45538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
45548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
45558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free_ion_memory(&drv_ctx.extradata_info.ion);
45568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
45578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
45588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
45598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
45608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
45618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::use_output_buffer(
45628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_HANDLETYPE            hComp,
45638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
45648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_U32                   port,
45658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_PTR                   appData,
45668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_U32                   bytes,
45678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_U8*                   buffer)
45688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
45698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
45708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
45718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned                         i= 0; // Temporary counter
45728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
45738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_PTR privateAppData = NULL;
45748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    private_handle_t *handle = NULL;
45758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U8 *buff = buffer;
4576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) hComp;
4577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) port;
45788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
45798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!m_out_mem_ptr) {
45808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
45818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = allocate_output_headers();
45828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_pSwVdec && eRet == OMX_ErrorNone)
45838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = allocate_extradata();
45848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
45858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
45868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (eRet == OMX_ErrorNone) {
45878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for(i=0; i< drv_ctx.op_buf.actualcount; i++) {
45888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(BITMASK_ABSENT(&m_out_bm_count,i))
45898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
45908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
45918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
45928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
45938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
45948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
45958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(i >= drv_ctx.op_buf.actualcount) {
45968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount);
45978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
45988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
45998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
46008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (dynamic_buf_mode) {
46018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_pSwVdec && !m_pSwVdecOpBuffer)
46028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
46038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            SWVDEC_PROP prop;
46048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("allocating m_pSwVdecOpBuffer %d", drv_ctx.op_buf.actualcount);
46058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pSwVdecOpBuffer = (SWVDEC_OPBUFFER*)calloc(sizeof(SWVDEC_OPBUFFER), drv_ctx.op_buf.actualcount);
46068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
46078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
46088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *bufferHdr = (m_out_mem_ptr + i );
46098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (*bufferHdr)->pBuffer = NULL;
46108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // for full dsp mode
46118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_pSwVdec && i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
46128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            enum v4l2_buf_type buf_type;
46138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            int rr = 0;
46148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
46158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (rr = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
46168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("STREAMON FAILED : %d", rr);
46178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorInsufficientResources;
46188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
46198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                streaming[CAPTURE_PORT] = true;
46208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("STREAMON Successful");
46218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
46228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
46238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        BITMASK_SET(&m_out_bm_count,i);
46248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (*bufferHdr)->pAppPrivate = appData;
46258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (*bufferHdr)->pBuffer = buffer;
46268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (*bufferHdr)->nAllocLen = sizeof(struct VideoDecoderOutputMetaData);
46278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
46288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // SWVdec memory allocation and set the output buffer
46298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_pSwVdecOpBuffer) {
46308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pSwVdecOpBuffer[i].nSize = sizeof(struct VideoDecoderOutputMetaData);
46318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pSwVdecOpBuffer[i].pBuffer = buffer;
4632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_pSwVdecOpBuffer[i].pClientBufferData = (void*)(unsigned long)i;
46338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
46348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
46358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return eRet;
46368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
46378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
46388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (eRet == OMX_ErrorNone) {
46398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
46408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_enable_android_native_buffers) {
46418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_use_android_native_buffers) {
46428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
46438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                sp<android_native_buffer_t> nBuf = params->nativeBuffer;
46448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                handle = (private_handle_t *)nBuf->handle;
46458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                privateAppData = params->pAppPrivate;
46468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
46478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                handle = (private_handle_t *)buff;
46488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                privateAppData = appData;
46498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
46508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
46518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
46528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
46538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    " expected %u, got %lu",
46548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
46558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorBadParameter;
46568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
46578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
46588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.buffer_size = (OMX_U32)handle->size;
46598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!m_use_android_native_buffers) {
46608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (!secure_mode) {
46618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    buff =  (OMX_U8*)mmap(0, handle->size,
46628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
46638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (buff == MAP_FAILED) {
46648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
46658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return OMX_ErrorInsufficientResources;
46668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
46678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
46688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
46698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#if defined(_ANDROID_ICS_)
46708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            native_buffer[i].nativehandle = handle;
46718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            native_buffer[i].privatehandle = handle;
46728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
46738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(!handle) {
46748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
46758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorBadParameter;
46768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
46778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
46788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[i].offset = 0;
46798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
46808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[i].mmaped_size =
46818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
46828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf_ion_info[i].fd_ion_data.fd = handle->fd;
4683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            //drv_ctx.op_buf_ion_info[i].fd_ion_data.handle = (ion_user_handle_t)handle;
4684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_HIGH("Native Buffer vaddr %p, idx %d fd %d len %d", buff,i, handle->fd , drv_ctx.op_buf.buffer_size);
46858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else
46868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
46878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
46888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!ouput_egl_buffers && !m_use_output_pmem) {
46898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
46908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("allocate output buffer memory size %d", drv_ctx.op_buf.buffer_size);
46918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
46928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
46938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
46948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
46958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
46968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd);
46978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return OMX_ErrorInsufficientResources;
46988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
46998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
47008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
47018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else
47028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
47038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    open (MEM_DEVICE,O_RDWR);
47048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
47058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
47068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
47078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return OMX_ErrorInsufficientResources;
47088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
47098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
47108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
47118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(drv_ctx.ptr_outputbuffer[i].pmem_fd == 0)
47128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
47138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].pmem_fd = \
47148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        open (MEM_DEVICE,O_RDWR);
47158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
47168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
47178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return OMX_ErrorInsufficientResources;
47188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
47198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
47208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
47218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
47228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.op_buf.buffer_size,
47238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.op_buf.alignment))
47248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
47258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
47268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
47278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return OMX_ErrorInsufficientResources;
47288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
47298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
47308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
47318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(!secure_mode) {
47328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].bufferaddr =
47338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
47348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        PROT_READ|PROT_WRITE, MAP_SHARED,
47358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
47368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
47378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
47388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
47398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
47408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
47418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Unable to mmap output buffer");
47428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return OMX_ErrorInsufficientResources;
47438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
47448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
47458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = 0;
47468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                privateAppData = appData;
47478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
47488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else {
47498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
47508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Use_op_buf: out_pmem=%d",m_use_output_pmem);
47518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (!appData || !bytes ) {
47528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if(!secure_mode && !buffer) {
47538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case");
47548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return OMX_ErrorBadParameter;
47558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
47568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
47578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
47588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
47598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
47608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
47618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (!pmem_list->entryList || !pmem_list->entryList->entry ||
47628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    !pmem_list->nEntries ||
47638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
47648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Pmem info not valid in use buffer");
47658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return OMX_ErrorBadParameter;
47668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
47678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
47688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pmem_list->entryList->entry;
47698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
47708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (unsigned int)pmem_info->pmem_fd);
47718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
47728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
47738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
47748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].mmaped_size =
47758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
47768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                privateAppData = appData;
47778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
47788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
47798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
47808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
47818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            *bufferHdr = (m_out_mem_ptr + i );
47828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(secure_mode)
47838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
47848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
47858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
47868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                sizeof (vdec_bufferpayload));
47878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
47888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
47898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr,
47908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd );
47918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
47928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_pSwVdec)
47938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
47948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (m_pSwVdecOpBuffer == NULL)
47958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
47968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("allocating m_pSwVdecOpBuffer %d", drv_ctx.op_buf.actualcount);
47978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    m_pSwVdecOpBuffer = (SWVDEC_OPBUFFER*)calloc(sizeof(SWVDEC_OPBUFFER), drv_ctx.op_buf.actualcount);
47988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
47998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
48008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // SWVdec memory allocation and set the output buffer
48018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_pSwVdecOpBuffer[i].nSize = drv_ctx.ptr_outputbuffer[i].mmaped_size;
48028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_pSwVdecOpBuffer[i].pBuffer = (uint8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
4803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_pSwVdecOpBuffer[i].pClientBufferData = (void*)(unsigned long)i;
48048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (SWVDEC_S_SUCCESS !=SwVdec_SetOutputBuffer(m_pSwVdec, &m_pSwVdecOpBuffer[i]))
48058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
48068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("SwVdec_SetOutputBuffer failed in use_output_buffer");
48078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return OMX_ErrorInsufficientResources;
48088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
48098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
48108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
48118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
48128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                struct v4l2_buffer buf;
48138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                struct v4l2_plane plane[VIDEO_MAX_PLANES];
48148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                int extra_idx = 0;
48158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buf.index = i;
48168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
48178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buf.memory = V4L2_MEMORY_USERPTR;
48188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                plane[0].length = drv_ctx.op_buf.buffer_size;
48198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
48208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
48218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
48228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
48238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                plane[0].data_offset = 0;
48248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
48258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
48268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
48278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
48288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
48298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
48308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
48318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
48328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    plane[extra_idx].data_offset = 0;
48338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                } else if  (extra_idx >= VIDEO_MAX_PLANES) {
48348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
48358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return OMX_ErrorBadParameter;
48368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
48378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buf.m.planes = plane;
48388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buf.length = drv_ctx.num_planes;
48398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr);
48418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
48428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
48438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Failed to prepare bufs");
48448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    /*TODO: How to handle this case */
48458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return OMX_ErrorInsufficientResources;
48468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
48478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
48488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
48498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    enum v4l2_buf_type buf_type;
48508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
48518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
48528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return OMX_ErrorInsufficientResources;
48538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    } else {
48548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        streaming[CAPTURE_PORT] = true;
48558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("STREAMON Successful");
48568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
48578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
48588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
48598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
48608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
48618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_enable_android_native_buffers) {
48628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
48638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
48648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
48658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (*bufferHdr)->pBuffer = buff;
48668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
48678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (*bufferHdr)->pAppPrivate = privateAppData;
48688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_SET(&m_out_bm_count,i);
48698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
48708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
48718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
48728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
48738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
48748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
48758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::use_input_heap_buffers
48768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
48778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
48788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Use Buffer Heap allocation method implementation.
48798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
48808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
48818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan<TBD>.
48828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
48838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
48848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None , if everything successful.
48858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
48868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
48878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
48888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_HANDLETYPE            hComp,
48898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
48908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_U32                   port,
48918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_PTR                   appData,
48928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_U32                   bytes,
48938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_U8*                   buffer)
48948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
48958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer);
48968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
48978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!m_inp_heap_ptr)
48988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
48998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
49008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ip_buf.actualcount);
49018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!m_phdr_pmem_ptr)
49028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
49038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
49048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ip_buf.actualcount);
49058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!m_inp_heap_ptr || !m_phdr_pmem_ptr)
49068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
49078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Insufficent memory");
49088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
49098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
49108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount)
49118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
49128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input_use_buffer = true;
49138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
49148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
49158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
49168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
49178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
49188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
49198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
49208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet =
49218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
49228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
4923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[m_in_alloc_cnt],
4924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)NULL, (unsigned  long)NULL))
49258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
49268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
49278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
49288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
49298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_in_alloc_cnt++;
49308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
49318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
49328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
49338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("All i/p buffers have been set!");
49348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
49358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
49368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
49378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
49388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
49398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
49408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
49418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::UseBuffer
49428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
49438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
49448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Use Buffer method implementation.
49458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
49468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
49478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan<TBD>.
49488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
49498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
49508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None , if everything successful.
49518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
49528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
49538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::use_buffer(
49548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_IN OMX_HANDLETYPE            hComp,
49558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
49568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_IN OMX_U32                   port,
49578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_IN OMX_PTR                   appData,
49588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_IN OMX_U32                   bytes,
49598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    OMX_IN OMX_U8*                   buffer)
49608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
49618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE error = OMX_ErrorNone;
49628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
49638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
49648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (bufferHdr == NULL || bytes == 0)
49658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
49668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(!secure_mode && buffer == NULL) {
49678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
49688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorBadParameter;
49698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
49708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
49718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state == OMX_StateInvalid)
49728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
49738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Use Buffer in Invalid State");
49748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidState;
49758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
49768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(port == OMX_CORE_INPUT_PORT_INDEX)
49778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
49788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
49798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
49808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
49818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
49828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
49838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        error = OMX_ErrorBadPortIndex;
49848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
49858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", (unsigned int)port, *bufferHdr, error);
49868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(error == OMX_ErrorNone)
49878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
49888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(allocate_done())
49898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
49908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Use Buffer: allocate_done");
49918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
49928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
49938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Send the callback now
49948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
49958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_CommandStateSet,OMX_StateIdle,
49968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                   OMX_COMPONENT_GENERATE_EVENT);
49978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
49988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_pSwVdec)
49998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
50008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Use Buffer: SwVdec_Start");
50018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                SwVdec_Start(m_pSwVdec);
50028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
50038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
50048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
50058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
50068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
50078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
50088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            post_event(OMX_CommandPortEnable,
50098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_CORE_INPUT_PORT_INDEX,
50108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
50118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
50128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
50138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
50148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
50158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
50168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            post_event(OMX_CommandPortEnable,
50178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_CORE_OUTPUT_PORT_INDEX,
50188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
50198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
50208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
50218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return error;
50228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
50238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
50248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
50258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
50268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
50278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes)
50288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
50298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_inp_heap_ptr[bufferindex].pBuffer)
50308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            free(m_inp_heap_ptr[bufferindex].pBuffer);
50318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_inp_heap_ptr[bufferindex].pBuffer = NULL;
50328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
50338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (pmem_bufferHdr)
50348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free_input_buffer(pmem_bufferHdr);
50358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
50368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
50378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
50388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
50398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
50408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned int index = 0;
50418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (bufferHdr == NULL || m_inp_mem_ptr == NULL)
50428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
50438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
50448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
50458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
50468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    index = bufferHdr - m_inp_mem_ptr;
50478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
50488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
50498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer)
50508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
50518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
50528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0)
50538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
50548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            struct vdec_setbuffer_cmd setbuffers;
50558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
50568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
50578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                sizeof (vdec_bufferpayload));
50588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("unmap the input buffer fd=%d",
50598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_inputbuffer[index].pmem_fd);
5060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("unmap the input buffer size=%d  address = %p",
50618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_inputbuffer[index].mmaped_size,
5062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                drv_ctx.ptr_inputbuffer[index].bufferaddr);
50638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
50648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_inputbuffer[index].mmaped_size);
50658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
50668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
50678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr)
50688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
50698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free(m_desc_buffer_ptr[index].buf_addr);
50708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_desc_buffer_ptr[index].buf_addr = NULL;
50718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_desc_buffer_ptr[index].desc_data_size = 0;
50728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
50738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
50748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
50758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
50768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
50778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
50788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
50798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
50808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
50818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
50828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
50838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
50848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned int index = 0;
50858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
50868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (bufferHdr == NULL || m_out_mem_ptr == NULL)
50878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
50888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
50898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
50908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
50918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    index = bufferHdr - m_out_mem_ptr;
50928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index);
50938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
50948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (index < drv_ctx.op_buf.actualcount
50958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        && drv_ctx.ptr_outputbuffer)
50968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
5097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %p", index,
5098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.ptr_outputbuffer[index].bufferaddr);
50998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
51008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        struct vdec_setbuffer_cmd setbuffers;
51018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
51028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
51038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sizeof (vdec_bufferpayload));
51048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
51058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_enable_android_native_buffers) {
51068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
51078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
51088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ptr_outputbuffer[index].mmaped_size);
51098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
51108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
51118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else {
51128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
51138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem)
51148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
51158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("unmap the output buffer fd = %d",
51168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ptr_outputbuffer[0].pmem_fd);
5117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_LOW("unmap the ouput buffer size=%d  address = %p",
51188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
5119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    drv_ctx.ptr_outputbuffer[0].bufferaddr);
51208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
51218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
51228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
51238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
51248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
51258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
51268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
51278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
51288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
51298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
51308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
51318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (release_output_done()) {
51328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            free_extradata();
51338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
51348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
51358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
51368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
51378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
51388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
51398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
51408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
51418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                   OMX_BUFFERHEADERTYPE **bufferHdr,
51428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                   OMX_U32              port,
51438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                   OMX_PTR              appData,
51448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                   OMX_U32              bytes)
51458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
51468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE *input = NULL;
51478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned char *buf_addr = NULL;
51488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
51498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned   i = 0;
51508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
51518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /* Sanity Check*/
51528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (bufferHdr == NULL)
51538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
51548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
51558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
51568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
51578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_inp_heap_ptr == NULL)
51588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
51598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
51608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
51618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ip_buf.actualcount);
51628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
51638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
51648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ip_buf.actualcount);
51658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
51668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_inp_heap_ptr == NULL)
51678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
51688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("m_inp_heap_ptr Allocation failed ");
51698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
51708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
51718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
51728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
51738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /*Find a Free index*/
51748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
51758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
51768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(BITMASK_ABSENT(&m_heap_inp_bm_count,i))
51778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
51788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
51798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
51808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
51818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
51828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
51838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (i < drv_ctx.ip_buf.actualcount)
51848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
51858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
51868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
51878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (buf_addr == NULL)
51888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
51898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
51908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
51918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
51928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *bufferHdr = (m_inp_heap_ptr + i);
51938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input = *bufferHdr;
51948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        BITMASK_SET(&m_heap_inp_bm_count,i);
51958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
51968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input->pBuffer           = (OMX_U8 *)buf_addr;
51978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
51988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input->nVersion.nVersion = OMX_SPEC_VERSION;
51998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
52008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input->pAppPrivate       = appData;
52018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
52028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr );
52038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
52048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
52058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*Add the Buffers to freeq*/
5206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[i],
5207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)NULL, (unsigned long)NULL))
52088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
52098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
52108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
52118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
52128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
52138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
52148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
52158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
52168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
52178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
52198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
52218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
52248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
52258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::AllocateInputBuffer
52268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
52288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanHelper function for allocate buffer in the input pin
52298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
52318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
52328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
52348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
52358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
52378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
52388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_HANDLETYPE            hComp,
52398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
52408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_U32                   port,
52418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_PTR                   appData,
52428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_U32                   bytes)
52438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
52448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
52458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
52468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE *input = NULL;
52478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned   i = 0;
52488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned char *buf_addr = NULL;
52498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int pmem_fd = -1;
5250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) hComp;
5251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) port;
52528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(bytes != drv_ctx.ip_buf.buffer_size)
52548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
52558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Requested Size is wrong %d epected is %d",
52568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (int)bytes, drv_ctx.ip_buf.buffer_size);
52578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
52588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
52598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!m_inp_mem_ptr)
52618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
52628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
52638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ip_buf.actualcount,
52648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ip_buf.buffer_size);
52658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
52678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
52688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_inp_mem_ptr == NULL)
52708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
52718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
52728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
52738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
52758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
52768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (drv_ctx.ptr_inputbuffer == NULL)
52788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
52798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
52808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
52818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
52828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
52838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
52848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (drv_ctx.ip_buf_ion_info == NULL)
52868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
52878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
52888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
52898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
52908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for (i=0; i < drv_ctx.ip_buf.actualcount; i++)
52928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
52938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
52948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
52958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
52968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
52978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
52988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
52998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE)
53008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
53018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // allocate swvdec input buffers
53028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pSwVdecIpBuffer = (SWVDEC_IPBUFFER *)calloc(sizeof(SWVDEC_IPBUFFER), drv_ctx.ip_buf.actualcount);
53038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_pSwVdecIpBuffer == NULL) {
53048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet =  OMX_ErrorInsufficientResources;
53058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
53068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
53078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
53088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
53098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for(i=0; i< drv_ctx.ip_buf.actualcount; i++)
53108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
53118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(BITMASK_ABSENT(&m_inp_bm_count,i))
53128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
53138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
53148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
53158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
53168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
53178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
53188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(i < drv_ctx.ip_buf.actualcount)
53198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
53208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
53218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int heap = 0;
53228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_
53238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        heap = ION_ADSP_HEAP_ID;
5324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else
5325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        heap = ION_IOMMU_HEAP_ID;
53268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
53278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate ion input Buffer size %d", drv_ctx.ip_buf.buffer_size);
53288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
53298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
53308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
53318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0, heap);
53328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
53338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
53348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
53358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
53368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else
53378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pmem_fd = open (MEM_DEVICE,O_RDWR);
53388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
53398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pmem_fd < 0)
53408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
53418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
53428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
53438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
53448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
53458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pmem_fd == 0)
53468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
53478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pmem_fd = open (MEM_DEVICE,O_RDWR);
53488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
53498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (pmem_fd < 0)
53508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
53518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
53528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorInsufficientResources;
53538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
53548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
53558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
53568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
53578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ip_buf.alignment))
53588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
53598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
53608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            close(pmem_fd);
53618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
53628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
53638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
53648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!secure_mode) {
53658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf_addr = (unsigned char *)mmap(NULL,
53668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ip_buf.buffer_size,
53678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
53688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
53698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (buf_addr == MAP_FAILED)
53708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
53718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                close(pmem_fd);
53728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
53738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
53748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
53758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Map Failed to allocate input buffer");
53768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorInsufficientResources;
53778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
53788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
53798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *bufferHdr = (m_inp_mem_ptr + i);
53808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (secure_mode)
53818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
53828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
53838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
53848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
53858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
53868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
53878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_inputbuffer [i].offset = 0;
53888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
53898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_pSwVdec || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
53908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
53918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            struct v4l2_buffer buf;
53928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            struct v4l2_plane plane;
53938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            int rc;
53948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf.index = i;
53958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
53968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf.memory = V4L2_MEMORY_USERPTR;
53978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane.bytesused = 0;
53988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
53998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
54008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
54018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane.reserved[1] = 0;
54028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
54038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf.m.planes = &plane;
54048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf.length = 1;
54058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
5406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_inputbuffer[i].bufferaddr);
54078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
54088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (rc) {
54098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed to prepare bufs");
54108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                /*TODO: How to handle this case */
54118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorInsufficientResources;
54128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
54138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
54148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if (m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE)
54158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
54168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pSwVdecIpBuffer[i].pBuffer = buf_addr;
5417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_pSwVdecIpBuffer[i].pClientBufferData = (void*)(unsigned long)i;
54188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
54198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
54208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input = *bufferHdr;
54218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        BITMASK_SET(&m_inp_bm_count,i);
54228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer address %p of pmem idx %d",*bufferHdr, i);
54238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (secure_mode)
5424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            input->pBuffer = (OMX_U8 *)(unsigned long)drv_ctx.ptr_inputbuffer [i].pmem_fd;
54258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
54268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            input->pBuffer           = (OMX_U8 *)buf_addr;
54278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
54288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input->nVersion.nVersion = OMX_SPEC_VERSION;
54298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
54308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input->pAppPrivate       = appData;
54318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
54328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
54338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
54348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (drv_ctx.disable_dmx)
54358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
54368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = allocate_desc_buffer(i);
54378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
54388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
54398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
54408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
54418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found");
54428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
54438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
54448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
54458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
54468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
54478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
54488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
54498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
54508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::AllocateOutputBuffer
54518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
54528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
54538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanHelper fn for AllocateBuffer in the output pin
54548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
54558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
54568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan<TBD>.
54578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
54588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
54598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None if everything went well.
54608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
54618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
54628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
54638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_HANDLETYPE            hComp,
54648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
54658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_U32                   port,
54668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_PTR                   appData,
54678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_U32                   bytes)
54688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
5469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)hComp;
5470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)port;
54718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
54728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
54738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned                         i= 0; // Temporary counter
54748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
54758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int extra_idx = 0;
54768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
54778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int ion_device_fd =-1;
54788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct ion_allocation_data ion_alloc_data;
54798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct ion_fd_data fd_ion_data;
54808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
54818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!m_out_mem_ptr)
54828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
54838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
54848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.actualcount,
54858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.buffer_size);
54868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int nBufHdrSize        = 0;
54878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int nPlatformEntrySize = 0;
54888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int nPlatformListSize  = 0;
54898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int nPMEMInfoSize = 0;
54908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int pmem_fd = -1;
54918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned char *pmem_baseaddress = NULL;
54928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
54938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
54948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
54958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
54968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
54978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)",
54988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.actualcount);
54998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nBufHdrSize        = drv_ctx.op_buf.actualcount *
55008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE);
55018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
55028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
55038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
55048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nPlatformListSize  = drv_ctx.op_buf.actualcount *
55058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
55068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
55078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
55088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
55098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
55108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE),
55118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nPMEMInfoSize,
55128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nPlatformListSize);
55138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize,
55148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.actualcount);
55158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
55168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("allocate outputBuffer size %d",drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount);
55178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int heap_id = 0;
55188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int flags = secure_mode ? ION_SECURE : 0;
55198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_pSwVdec) {
55208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_
55218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            heap_id = ION_ADSP_HEAP_ID;
5522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else
5523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            heap_id = ION_IOMMU_HEAP_ID;
55248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
55258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
55268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ion_device_fd = alloc_map_ion_memory(
55278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
55288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.alignment,
55298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            &ion_alloc_data, &fd_ion_data,flags, heap_id);
55308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ion_device_fd < 0) {
55318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
55328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
55338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pmem_fd = fd_ion_data.fd;
55348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else
55358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pmem_fd = open (MEM_DEVICE,O_RDWR);
55368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
55378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pmem_fd < 0)
55388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
55398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
55408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.op_buf.buffer_size);
55418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
55428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
55438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
55448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(pmem_fd == 0)
55458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
55468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pmem_fd = open (MEM_DEVICE,O_RDWR);
55478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
55488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (pmem_fd < 0)
55498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
55508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
55518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.op_buf.buffer_size);
55528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorInsufficientResources;
55538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
55548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
55558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
55568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
55578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.actualcount,
55588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.alignment))
55598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
55608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
55618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            close(pmem_fd);
55628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
55638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
55648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
55658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!secure_mode) {
55668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pmem_baseaddress = (unsigned char *)mmap(NULL,
55678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (drv_ctx.op_buf.buffer_size *
55688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.op_buf.actualcount),
55698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
55708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (pmem_baseaddress == MAP_FAILED)
55718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
55728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("MMAP failed for Size %d",
55738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.op_buf.buffer_size);
55748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                close(pmem_fd);
55758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
55768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
55778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
55788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorInsufficientResources;
55798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
55808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
55818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
55828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // Alloc mem for platform specific info
55838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        char *pPtr=NULL;
55848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
55858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nPMEMInfoSize,1);
55868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
55878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc (sizeof(struct vdec_bufferpayload),
55888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.actualcount);
55898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
55908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc (sizeof (struct vdec_output_frameinfo),
55918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.actualcount);
55928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
55938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
55948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc (sizeof(struct vdec_ion),
55958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.actualcount);
55968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
55978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
55988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_pSwVdec && m_pSwVdecOpBuffer == NULL)
55998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
56008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pSwVdecOpBuffer = (SWVDEC_OPBUFFER*)calloc(sizeof(SWVDEC_OPBUFFER), drv_ctx.op_buf.actualcount);
56018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
56028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer && drv_ctx.ptr_respbuffer
56038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            && ((m_pSwVdec && m_pSwVdecOpBuffer) || (!m_pSwVdec)) )
56048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
56058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[0].mmaped_size =
56068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (drv_ctx.op_buf.buffer_size *
56078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.op_buf.actualcount);
56088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bufHdr          =  m_out_mem_ptr;
56098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
56108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
56118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (((char *) m_platform_list)  + nPlatformListSize);
56128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
56138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (((char *) m_platform_entry) + nPlatformEntrySize);
56148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pPlatformList   = m_platform_list;
56158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pPlatformEntry  = m_platform_entry;
56168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pPMEMInfo       = m_pmem_info;
56178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
56188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
56198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
56208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // Settting the entire storage nicely
56218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry);
56228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
56238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
56248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
56258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
56268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
56278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Set the values when we determine the right HxW param
56288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->nAllocLen          = bytes;
56298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->nFilledLen         = 0;
56308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->pAppPrivate        = appData;
56318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
56328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Platform specific PMEM Information
56338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Initialize the Platform Entry
56348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i);
56358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
56368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPlatformEntry->entry      = pPMEMInfo;
56378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Initialize the Platform List
56388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPlatformList->nEntries    = 1;
56398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPlatformList->entryList   = pPlatformEntry;
56408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Keep pBuffer NULL till vdec is opened
56418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->pBuffer            = NULL;
56428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->nOffset            = 0;
56438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
56448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
56458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPMEMInfo->pmem_fd = 0;
56468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->pPlatformPrivate = pPlatformList;
56478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
56488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
56498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_pmem_info[i].pmem_fd = pmem_fd;
56508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
56518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
56528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
56538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
56548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
56558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
56568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                /*Create a mapping between buffers*/
56578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
56588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_respbuffer[i].client_data = (void *)\
56598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    &drv_ctx.ptr_outputbuffer[i];
56608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
56618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr =
56628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
56638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
56648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("pmem_fd = %d offset = %d address = %p",
56658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
56668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].bufferaddr);
56678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Move the buffer and buffer header pointers
56688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr++;
56698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPMEMInfo++;
56708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPlatformEntry++;
56718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPlatformList++;
56728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
56738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
56748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
56758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
56768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
56778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_out_mem_ptr, pPtr);
56788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(m_out_mem_ptr)
56798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
56808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free(m_out_mem_ptr);
56818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_out_mem_ptr = NULL;
56828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
56838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(pPtr)
56848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
56858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free(pPtr);
56868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPtr = NULL;
56878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
56888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(drv_ctx.ptr_outputbuffer)
56898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
56908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free(drv_ctx.ptr_outputbuffer);
56918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer = NULL;
56928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
56938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(drv_ctx.ptr_respbuffer)
56948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
56958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free(drv_ctx.ptr_respbuffer);
56968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_respbuffer = NULL;
56978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
56988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
56998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (drv_ctx.op_buf_ion_info) {
57008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free o/p ion context");
57018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free(drv_ctx.op_buf_ion_info);
57028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.op_buf_ion_info = NULL;
57038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
57048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
57058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet =  OMX_ErrorInsufficientResources;
57068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
57078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ( (!m_pSwVdec) && (eRet == OMX_ErrorNone) )
57088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = allocate_extradata();
57098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
57108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
57118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for(i=0; i< drv_ctx.op_buf.actualcount; i++)
57128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
57138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(BITMASK_ABSENT(&m_out_bm_count,i))
57148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
57158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i);
57168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
57178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
57188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
57198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
57208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (eRet == OMX_ErrorNone)
57218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
57228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(i < drv_ctx.op_buf.actualcount)
57238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
57248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            int rc;
57258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
57268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
57278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
57288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            *bufferHdr = (m_out_mem_ptr + i );
57298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (secure_mode) {
57308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
57318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
57328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
57338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
57348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_pSwVdec)
57358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
57368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
57378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (*bufferHdr)->pAppPrivate = appData;
57388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_pSwVdecOpBuffer[i].nSize = drv_ctx.ptr_outputbuffer[i].mmaped_size;
57398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_pSwVdecOpBuffer[i].pBuffer = (*bufferHdr)->pBuffer;
5740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_pSwVdecOpBuffer[i].pClientBufferData = (void*)(unsigned long)i;
57418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                SwVdec_SetOutputBuffer(m_pSwVdec, &m_pSwVdecOpBuffer[i]);
57428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
57438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
57448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
57458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                struct v4l2_buffer buf;
57468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                struct v4l2_plane plane[VIDEO_MAX_PLANES];
57478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buf.index = i;
57488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
57498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buf.memory = V4L2_MEMORY_USERPTR;
57508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                plane[0].length = drv_ctx.op_buf.buffer_size;
57518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
57528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
57538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
57548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
57558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
57568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
57578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                plane[0].data_offset = 0;
57588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
57598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
57608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
57618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
57628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
57638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
57648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
57658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
57668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    plane[extra_idx].data_offset = 0;
57678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                } else if (extra_idx >= VIDEO_MAX_PLANES) {
57688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx);
57698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return OMX_ErrorBadParameter;
57708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
57718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buf.m.planes = plane;
57728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buf.length = drv_ctx.num_planes;
5773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr);
57748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
57758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (rc) {
57768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    /*TODO: How to handle this case */
57778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return OMX_ErrorInsufficientResources;
57788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
57798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
57808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
57818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    enum v4l2_buf_type buf_type;
57828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
57838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
57848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (rc) {
57858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return OMX_ErrorInsufficientResources;
57868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    } else {
57878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        streaming[CAPTURE_PORT] = true;
57888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("STREAMON Successful");
57898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
57908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
57918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
57928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
57938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (*bufferHdr)->pAppPrivate = appData;
57948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_SET(&m_out_bm_count,i);
57958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
57968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
57978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
57988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient");
57998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
58008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
58018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
58028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
58038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
58048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
58058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
58068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
58078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan// AllocateBuffer  -- API Call
58088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
58098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
58108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::AllocateBuffer
58118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
58128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
58138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanReturns zero if all the buffers released..
58148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
58158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
58168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
58178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
58188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
58198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
58208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
58218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
58228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
58238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                         OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
58248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                         OMX_IN OMX_U32                        port,
58258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                         OMX_IN OMX_PTR                     appData,
58268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                         OMX_IN OMX_U32                       bytes)
58278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
58288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned i = 0;
58298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
58308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
58318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port);
58328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state == OMX_StateInvalid)
58338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
58348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State");
58358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidState;
58368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
58378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
58388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(port == OMX_CORE_INPUT_PORT_INDEX)
58398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
58408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (arbitrary_bytes)
58418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
58428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
58438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
58448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
58458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
58468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
58478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
58488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
58498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
58508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
58518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
58528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            appData,bytes);
58538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
58548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
58558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
58568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
58578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
58588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
58598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
58608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(eRet == OMX_ErrorNone)
58618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
58628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(allocate_done())
58638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
58648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
58658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
58668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Send the callback now
58678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
58688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_CommandStateSet,OMX_StateIdle,
58698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
58708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
58718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_pSwVdec)
58728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
58738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("allocate_buffer: SwVdec_Start");
58748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                SwVdec_Start(m_pSwVdec);
58758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
58768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
58778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated)
58788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
58798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
58808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
58818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
58828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_CommandPortEnable,
58838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_CORE_INPUT_PORT_INDEX,
58848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
58858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
58868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
58878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated)
58888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
58898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
58908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
58918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
58928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                post_event(OMX_CommandPortEnable,
58938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_CORE_OUTPUT_PORT_INDEX,
58948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
58958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
58968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
58978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
58988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet);
58998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
59008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
59018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
59028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan// Free Buffer - API call
59038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
59048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
59058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::FreeBuffer
59068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
59078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
59088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
59098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
59108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
59118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
59128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
59138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
59148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
59158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
59168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
59178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                     OMX_IN OMX_U32                 port,
59188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                     OMX_IN OMX_BUFFERHEADERTYPE* buffer)
59198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
59208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
59218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned int nPortIndex;
5922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) hComp;
59238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
59248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state == OMX_StateIdle &&
59258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
59268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
59278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending");
59288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
59298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
59308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX))
59318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
59328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Buffer while port %d disabled", (int)port);
59338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
59348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
59358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
59368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (port == OMX_CORE_OUTPUT_PORT_INDEX &&
59378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING)))
59388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
59398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Buffer while port %d enable pending", (int)port);
59408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
59418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if(m_state == OMX_StateExecuting || m_state == OMX_StatePause)
59428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
59438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled");
59448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        post_event(OMX_EventError,
59458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_ErrorPortUnpopulated,
59468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_COMPONENT_GENERATE_EVENT);
59478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
59488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
59498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
59508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (m_state != OMX_StateInvalid)
59518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
59528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid state %d to free buffer,port %d lost Buffers", m_state, (int)port);
59538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        post_event(OMX_EventError,
59548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_ErrorPortUnpopulated,
59558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_COMPONENT_GENERATE_EVENT);
59568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
59578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
59588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(port == OMX_CORE_INPUT_PORT_INDEX)
59598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
59608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*Check if arbitrary bytes*/
59618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(!arbitrary_bytes && !input_use_buffer)
59628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nPortIndex = buffer - m_inp_mem_ptr;
59638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
59648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nPortIndex = buffer - m_inp_heap_ptr;
59658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
59668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex);
59678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(nPortIndex < drv_ctx.ip_buf.actualcount)
59688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
59698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // Clear the bit associated with it.
59708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
59718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
59728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (input_use_buffer == true)
59738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
59748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
59758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex);
59768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(m_phdr_pmem_ptr)
59778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
59788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
59798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
59808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
59818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (arbitrary_bytes)
59828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
59838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if(m_phdr_pmem_ptr)
59848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
59858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    else
59868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        free_input_buffer(nPortIndex,NULL);
59878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
59888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
59898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    free_input_buffer(buffer);
59908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
59918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_inp_bPopulated = OMX_FALSE;
59928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /*Free the Buffer Header*/
59938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (release_input_done())
59948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
59958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("ALL input buffers are freed/released");
59968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free_input_buffer_header();
59978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
59988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
59998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
60008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
60018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid");
60028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorBadPortIndex;
60038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
60048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
60058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
60068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            && release_input_done())
60078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
60088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("MOVING TO INPUT DISABLED STATE");
60098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
60108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            post_event(OMX_CommandPortDisable,
60118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_CORE_INPUT_PORT_INDEX,
60128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
60138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
60148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
60158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if(port == OMX_CORE_OUTPUT_PORT_INDEX)
60168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
60178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // check if the buffer is valid
60188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nPortIndex = buffer - client_buffers.get_il_buf_hdr();
60198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(nPortIndex < drv_ctx.op_buf.actualcount)
60208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
60218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex);
60228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // Clear the bit associated with it.
60238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
60248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_out_bPopulated = OMX_FALSE;
60258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            client_buffers.free_output_buffer (buffer);
60268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
60278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (release_output_done())
60288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
60298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free_output_buffer_header();
60308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
60318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
60328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("release_output_done: start free_interm_buffers");
60338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    free_interm_buffers();
60348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
6035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                else if (m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE)
6036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
6037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_LOW("free m_pSwVdecOpBuffer");
6038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    if (m_pSwVdecOpBuffer)
6039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    {
6040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        free(m_pSwVdecOpBuffer);
6041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        m_pSwVdecOpBuffer = NULL;
6042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    }
6043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
60448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
60458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
60468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
60478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
60488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid");
60498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorBadPortIndex;
60508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
60518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
60528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            && release_output_done())
60538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
60548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("MOVING TO OUTPUT DISABLED STATE");
60558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
60568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_ICS_
60578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_enable_android_native_buffers)
60588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
60598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
60608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
60618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
60628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
60638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
60648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            post_event(OMX_CommandPortDisable,
60658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_CORE_OUTPUT_PORT_INDEX,
60668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
60678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
60688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
60698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
60708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
60718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
60728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
60738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if((eRet == OMX_ErrorNone) &&
60748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
60758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
60768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(release_done())
60778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
60788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // Send the callback now
60798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
60808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_pSwVdec)
60818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
60828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                SwVdec_Stop(m_pSwVdec);
60838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
60848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            post_event(OMX_CommandStateSet, OMX_StateLoaded,
60858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
60868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
60878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
60888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
60898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
60908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
60918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
60928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
60938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
60948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::EmptyThisBuffer
60958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
60968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
60978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanThis routine is used to push the encoded video frames to
60988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanthe video decoder.
60998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
61018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
61028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
61048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None if everything went successful.
61058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
61078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
61088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           OMX_IN OMX_BUFFERHEADERTYPE* buffer)
61098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
61108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
61118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
61128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state == OMX_StateInvalid)
61148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
61158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Empty this buffer in Invalid State");
61168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidState;
61178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
61188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer == NULL)
61208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
61218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL");
61228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
61238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
61248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!m_inp_bEnabled)
61268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
61278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled.");
61288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
61298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
61308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX)
61328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
61338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %lu", buffer->nInputPortIndex);
61348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadPortIndex;
61358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
61368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)
61388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
61398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        codec_config_flag = true;
61408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
61418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
61428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (perf_flag)
61448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
61458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!latency)
61468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
61478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            dec_time.stop();
61488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            latency = dec_time.processing_time_us();
61498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            dec_time.start();
61508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
61518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
61528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (arbitrary_bytes)
61548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
61558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nBufferIndex = buffer - m_inp_heap_ptr;
61568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
61578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
61588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
61598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (input_use_buffer == true)
61608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
61618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nBufferIndex = buffer - m_inp_heap_ptr;
61628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
61638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
61648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
61658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer = &m_inp_mem_ptr[nBufferIndex];
61668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %lu",
61678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
61688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
61698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else{
61708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nBufferIndex = buffer - m_inp_mem_ptr;
61718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
61728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
61738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (nBufferIndex > drv_ctx.ip_buf.actualcount )
61758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
61768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid");
61778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
61788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
61798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu) nFlags(%lu)",
61818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen, buffer->nFlags);
61828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (arbitrary_bytes)
61838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
6184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        post_event ((unsigned long)hComp,(unsigned long)buffer,
6185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
61868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
61878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
61888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
61898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
61908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            set_frame_rate(buffer->nTimeStamp);
6191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        post_event ((unsigned long)hComp,(unsigned long)buffer,
6192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)OMX_COMPONENT_GENERATE_ETB);
61938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
61948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
61958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
61968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
61978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
61988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
61998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::empty_this_buffer_proxy
62008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
62028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanThis routine is used to push the encoded video frames to
62038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanthe video decoder.
62048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
62068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
62078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
62098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None if everything went successful.
62108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
62128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
62138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                 OMX_IN OMX_BUFFERHEADERTYPE* buffer)
62148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
62158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int push_cnt = 0,i=0;
62168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned nPortIndex = 0;
62178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
62188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_input_frameinfo frameinfo;
62198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_bufferpayload *temp_buffer;
62208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_seqheader seq_header;
62218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool port_setting_changed = true;
62228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool not_coded_vop = false;
62238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /*Should we generate a Aync error event*/
62258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer == NULL || buffer->pInputPortPrivate == NULL)
62268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
62278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid");
62288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
62298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
62308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
62328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (nPortIndex > drv_ctx.ip_buf.actualcount)
62348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
62358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
62368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nPortIndex);
62378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
62388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
62398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY && m_fill_internal_bufers)
62418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
62428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fill_all_buffers_proxy_dsp(hComp);
62438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
62448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pending_input_buffers++;
62468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /* return zero length and not an EOS buffer */
62488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
62498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
62508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
62518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("return zero legth buffer");
6252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        post_event ((unsigned long)buffer,(unsigned long)VDEC_S_SUCCESS,
6253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)OMX_COMPONENT_GENERATE_EBD);
62548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorNone;
62558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
62568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(input_flush_progress == true
62588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        || not_coded_vop
62608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        )
62628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
62638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Flush in progress return buffer ");
6264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        post_event ((unsigned long)buffer, (unsigned long)VDEC_S_SUCCESS,
6265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)OMX_COMPONENT_GENERATE_EBD);
62668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorNone;
62678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
62688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
62708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > (int)drv_ctx.ip_buf.actualcount)
62728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
62738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
62748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
62758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
62778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /*for use buffer we need to memcpy the data*/
62788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    temp_buffer->buffer_len = buffer->nFilledLen;
62798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (input_use_buffer)
62818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
62828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (buffer->nFilledLen <= temp_buffer->buffer_len)
62838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
62848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(arbitrary_bytes)
62858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
62868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
62878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
62888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
62898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
62908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
62918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    buffer->nFilledLen);
62928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
62938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
62948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
62958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
62968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorBadParameter;
62978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
62988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
63008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
63018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frameinfo.bufferaddr = temp_buffer->bufferaddr;
63028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frameinfo.client_data = (void *) buffer;
63038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frameinfo.datalen = temp_buffer->buffer_len;
63048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frameinfo.flags = 0;
63058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frameinfo.offset = buffer->nOffset;
63068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frameinfo.pmem_fd = temp_buffer->pmem_fd;
63078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frameinfo.pmem_offset = temp_buffer->offset;
63088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frameinfo.timestamp = buffer->nTimeStamp;
63098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr)
63108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
63118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("ETB: dmx enabled");
63128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_demux_entries == 0)
63138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
63148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            extract_demux_addr_offsets(buffer);
63158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
63168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
63178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d", (int)m_demux_entries);
63188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        handle_demux_data(buffer);
63198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
63208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
63218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
63228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
63238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
63248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frameinfo.desc_addr = NULL;
63258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frameinfo.desc_size = 0;
63268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
63278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!arbitrary_bytes)
63288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
63298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frameinfo.flags |= buffer->nFlags;
63308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
63318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
63328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
63338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug_timestamp)
63348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
63358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(arbitrary_bytes)
63368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
63378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
63388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_timestamp_list.insert_ts(buffer->nTimeStamp);
63398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
63408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if(!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG))
63418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
63428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
63438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_timestamp_list.insert_ts(buffer->nTimeStamp);
63448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
63458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
63468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
63478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
63488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.in_buffer_log)
63498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
63508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        log_input_buffers((const char *)temp_buffer->bufferaddr, temp_buffer->buffer_len);
63518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
63528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
63538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ)
63548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
63558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
63568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
63578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
63588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
63598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
63608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
63618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached");
63628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
63638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        h264_scratch.nFilledLen = 0;
63648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nal_count = 0;
63658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        look_ahead_nal = false;
63668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frame_count = 0;
63678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_frame_parser.mutils)
63688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_frame_parser.mutils->initialize_frame_checking_environment();
63698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_frame_parser.flush();
63708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        h264_last_au_ts = LLONG_MAX;
63718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        h264_last_au_flags = 0;
63728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
63738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_demux_entries = 0;
63748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
63758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
63768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ( (!m_pSwVdec) || (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY) )
63778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
63788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        struct v4l2_buffer buf;
63798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        struct v4l2_plane plane;
63808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset( (void *)&buf, 0, sizeof(buf));
63818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset( (void *)&plane, 0, sizeof(plane));
63828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int rc;
63838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned long  print_count;
63848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS))
63858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
63868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf.flags = V4L2_QCOM_BUF_FLAG_EOS;
63878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("INPUT EOS reached") ;
63888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
63898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_ERRORTYPE eRet = OMX_ErrorNone;
63908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.index = nPortIndex;
63918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
63928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
63938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane.bytesused = temp_buffer->buffer_len;
63948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane.length = drv_ctx.ip_buf.buffer_size;
63958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
63968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned long)temp_buffer->offset;
63978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane.reserved[0] = temp_buffer->pmem_fd;
63988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane.reserved[1] = temp_buffer->offset;
63998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane.data_offset = 0;
64008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.m.planes = &plane;
64018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.length = 1;
64028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (frameinfo.timestamp >= LLONG_MAX) {
64038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
64048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
64058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        //assumption is that timestamp is in milliseconds
64068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
64078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
64088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
64098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
64108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
64118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(rc)
64128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
64138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver");
64148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorHardware;
64158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
64168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        codec_config_flag = false;
64178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("%s: codec_config cleared", __FUNCTION__);
64188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(!streaming[OUTPUT_PORT])
64198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
64208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            enum v4l2_buf_type buf_type;
64218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            int ret,r;
64228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
64238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
64248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
64258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
64268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(!ret) {
64278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful");
64288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                streaming[OUTPUT_PORT] = true;
64298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
64308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                /*TODO: How to handle this case */
64318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT");
64328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
6433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                post_event ((unsigned long)buffer,(unsigned long)VDEC_S_SUCCESS,
6434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    (unsigned long)OMX_COMPONENT_GENERATE_EBD);
64358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorBadParameter;
64368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
64378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
64388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
64398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE)
64408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
64418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // send this to the swvdec
64428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("empty_this_buffer_proxy bufHdr %p pBuffer %p nFilledLen %lu m_pSwVdecIpBuffer %p, idx %d",
64438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer, buffer->pBuffer, buffer->nFilledLen, m_pSwVdecIpBuffer, nPortIndex);
64448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pSwVdecIpBuffer[nPortIndex].nFlags = buffer->nFlags;
64458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pSwVdecIpBuffer[nPortIndex].nFilledLen = buffer->nFilledLen;
64468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pSwVdecIpBuffer[nPortIndex].nIpTimestamp = buffer->nTimeStamp;
64478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
64488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (SwVdec_EmptyThisBuffer(m_pSwVdec, &m_pSwVdecIpBuffer[nPortIndex]) != SWVDEC_S_SUCCESS) {
64498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ret = OMX_ErrorBadParameter;
64508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
6451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        codec_config_flag = false;
6452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_LOW("%s: codec_config cleared", __FUNCTION__);
64538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
64548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
64558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
64568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
64578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    time_stamp_dts.insert_timestamp(buffer);
64588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return ret;
64598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
64608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
64618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
64628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
64638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::FillThisBuffer
64648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
64658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
64668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanIL client uses this method to release the frame buffer
64678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanafter displaying them.
64688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
64698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
64708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
64718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
64728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
64738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
64748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
64758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
64768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
64778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          OMX_IN OMX_BUFFERHEADERTYPE* buffer)
64788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
6479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int nPortIndex = (unsigned int)(buffer - client_buffers.get_il_buf_hdr());
64808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state == OMX_StateInvalid)
64818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
64828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("FTB in Invalid State");
64838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidState;
64848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
64858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
64868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!m_out_bEnabled)
64878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
64888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled.");
64898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
64908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
64918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
64928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!buffer || !buffer->pBuffer || nPortIndex >= drv_ctx.op_buf.actualcount)
64938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
64948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:FTB invalid bufHdr %p, nPortIndex %u", buffer, nPortIndex);
64958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
64968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
64978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
64988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX)
64998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
65008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex);
65018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadPortIndex;
65028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
65038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (dynamic_buf_mode) {
65058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        private_handle_t *handle = NULL;
65068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        struct VideoDecoderOutputMetaData *meta;
65078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_U8 *buff = NULL;
65088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        //get the buffer type and fd info
65108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        meta = (struct VideoDecoderOutputMetaData *)buffer->pBuffer;
65118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        handle = (private_handle_t *)meta->pHandle;
65128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("FTB: buftype: %d bufhndl: %p", meta->eType, meta->pHandle);
65138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_lock(&m_lock);
65158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (out_dynamic_list[nPortIndex].ref_count == 0) {
65168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            //map the buffer handle based on the size set on output port definition.
65188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!secure_mode) {
65198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buff = (OMX_U8*)mmap(0, drv_ctx.op_buf.buffer_size,
65208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                   PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
65218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
65228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buff = (OMX_U8*) buffer;
65238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
65248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd = handle->fd;
65268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[nPortIndex].offset = 0;
65278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = buff;
65288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len = drv_ctx.op_buf.buffer_size;
65298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[nPortIndex].mmaped_size = drv_ctx.op_buf.buffer_size;
65308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("fill_this_buffer: bufHdr %p idx %d mapped pBuffer %p size %u", buffer, nPortIndex, buff, drv_ctx.op_buf.buffer_size);
65318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_pSwVdecOpBuffer) {
65328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_pSwVdecOpBuffer[nPortIndex].nSize = drv_ctx.op_buf.buffer_size;
65338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_pSwVdecOpBuffer[nPortIndex].pBuffer = buff;
65348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
65358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
65368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_unlock(&m_lock);
65378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf_ref_add(nPortIndex, drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd,
65388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_outputbuffer[nPortIndex].offset);
65398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
65408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
6542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    post_event((unsigned long) hComp, (unsigned long)buffer, (unsigned long)m_fill_output_msg);
65438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
65448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
65458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
65468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
65478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::fill_this_buffer_proxy
65488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
65508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanIL client uses this method to release the frame buffer
65518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanafter displaying them.
65528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
65548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
65558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
65578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
65588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
65608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
65618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_HANDLETYPE        hComp,
65628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
65638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
6564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)hComp;
65658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE nRet = OMX_ErrorNone;
65668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
65678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned nPortIndex = 0;
65688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_fillbuffer_cmd fillbuffer;
65698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
65708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
65718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
65738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (bufferAdd == NULL || nPortIndex >= drv_ctx.op_buf.actualcount)
65758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
6576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("FTBProxy: bufhdr = %p, il = %p, nPortIndex %u bufCount %u",
6577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             bufferAdd, ((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()),nPortIndex, drv_ctx.op_buf.actualcount);
65788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
65798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
65808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
65828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufferAdd, bufferAdd->pBuffer);
65838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /*Return back the output buffer to client*/
65848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_out_bEnabled != OMX_TRUE || output_flush_progress == true)
65858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
65868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Output Buffers return flush/disable condition");
65878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFilledLen = 0;
65888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_cb.FillBufferDone (hComp,m_app_data,buffer);
65898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorNone;
65908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
65918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pending_output_buffers++;
65928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
65938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
65948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (ptr_respbuffer)
65958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
65968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
65978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
65988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
65998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL)
66008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
66018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
66028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFilledLen = 0;
66038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_cb.FillBufferDone (hComp,m_app_data,buffer);
66048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pending_output_buffers--;
66058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
66068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
66078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
66088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_pSwVdec)
66098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
66108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("SwVdec_FillThisBuffer idx %d, bufHdr %p pBuffer %p", nPortIndex,
66118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bufferAdd, m_pSwVdecOpBuffer[nPortIndex].pBuffer);
66128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (SWVDEC_S_SUCCESS != SwVdec_FillThisBuffer(m_pSwVdec, &m_pSwVdecOpBuffer[nPortIndex]))
66138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
66148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("SwVdec_FillThisBuffer failed");
66158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
66168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
66178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
66188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
66198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int rc = 0;
66208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        struct v4l2_buffer buf;
66218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        struct v4l2_plane plane[VIDEO_MAX_PLANES];
66228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset( (void *)&buf, 0, sizeof(buf));
66238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
66248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int extra_idx = 0;
66258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
66268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.index = nPortIndex;
66278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
66288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
66298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[0].bytesused = buffer->nFilledLen;
66308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[0].length = drv_ctx.op_buf.buffer_size;
66318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[0].m.userptr =
66328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
66338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
66348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
66358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
66368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[0].data_offset = 0;
66378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
66388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
66398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane[extra_idx].bytesused = 0;
66408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
66418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
66428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
66438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
66448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
66458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
66468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane[extra_idx].data_offset = 0;
66478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if (extra_idx >= VIDEO_MAX_PLANES) {
66488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index higher than expected: %d", extra_idx);
66498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorBadParameter;
66508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
66518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.m.planes = plane;
66528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.length = drv_ctx.num_planes;
66538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
66548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (rc) {
66558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /*TODO: How to handle this case */
66568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to qbuf to driver");
66578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
66588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
66598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
66608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
66618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
66628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
66638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
66648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::SetCallbacks
66658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
66668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
66678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanSet the callbacks.
66688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
66698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
66708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
66718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
66728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
66738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None if everything successful.
66748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
66758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
66768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
66778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       OMX_IN OMX_CALLBACKTYPE* callbacks,
66788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       OMX_IN OMX_PTR             appData)
66798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
6680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)hComp;
66818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_cb       = *callbacks;
66828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
66838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_cb.EventHandler,m_cb.FillBufferDone);
66848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_app_data =    appData;
66858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNotImplemented;
66868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
66878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
66888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
66898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
66908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::ComponentDeInit
66918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
66928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
66938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDestroys the component and release memory allocated to the heap.
66948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
66958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
66968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan<TBD>.
66978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
66988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
66998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None if everything successful.
67008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
67018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
67028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
67038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
6704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)hComp;
67058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
67068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned i = 0;
67078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (OMX_StateLoaded != m_state)
67088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
67098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\
67108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_state);
67118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Playback Ended - FAILED");
67128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
67138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
67148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
67158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Playback Ended - PASSED");
67168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
67178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
67188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /*Check if the output buffers have to be cleaned up*/
67198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_out_mem_ptr)
67208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
67218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Freeing the Output Memory");
67228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ )
67238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
67248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            free_output_buffer (&m_out_mem_ptr[i]);
67258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
67268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_ICS_
67278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
67288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
67298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
67308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
67318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /*Check if the input buffers have to be cleaned up*/
67328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_inp_mem_ptr || m_inp_heap_ptr)
67338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
67348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Freeing the Input Memory");
67358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ )
67368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
67378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_inp_mem_ptr)
67388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free_input_buffer (i,&m_inp_mem_ptr[i]);
67398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
67408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free_input_buffer (i,NULL);
67418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
67428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
67438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    free_input_buffer_header();
67448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    free_output_buffer_header();
67458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(h264_scratch.pBuffer)
67468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
67478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(h264_scratch.pBuffer);
67488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        h264_scratch.pBuffer = NULL;
67498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
67508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
67518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (h264_parser)
67528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
67538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        delete h264_parser;
67548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        h264_parser = NULL;
67558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
67568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
67578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_platform_list)
67588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
67598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(m_platform_list);
67608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_platform_list = NULL;
67618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
67628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_vendor_config.pData)
67638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
67648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(m_vendor_config.pData);
67658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_vendor_config.pData = NULL;
67668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
67678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
67688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    // Reset counters in mesg queues
67698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_ftb_q.m_size=0;
67708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_cmd_q.m_size=0;
67718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_etb_q.m_size=0;
67728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_ftb_q.m_read = m_ftb_q.m_write =0;
67738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_cmd_q.m_read = m_cmd_q.m_write =0;
67748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_etb_q.m_read = m_etb_q.m_write =0;
67758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_ftb_q_dsp.m_size=0;
67768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_etb_q_swvdec.m_size=0;
67778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_ftb_q_dsp.m_read = m_ftb_q_dsp.m_write =0;
67788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_etb_q_swvdec.m_read = m_etb_q_swvdec.m_write =0;
67798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
67808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug_timestamp)
67818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
67828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_timestamp_list.reset_ts_list();
67838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
67848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
67858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
67868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.infile) {
67878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fclose(m_debug.infile);
67888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.infile = NULL;
67898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
67908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.outfile) {
67918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fclose(m_debug.outfile);
67928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.outfile = NULL;
67938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
67948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.imbfile) {
67958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fclose(m_debug.imbfile);
67968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.imbfile = NULL;
67978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
67988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
67998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_pSwVdec)
68008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
68018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        SwVdec_DeInit(m_pSwVdec);
68028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pSwVdec = NULL;
68038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
68048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec::component_deinit() complete");
68058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
68068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
68078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
68088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
68098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
68108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::UseEGLImage
68118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
68128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
68138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Use EGL Image method implementation <TBD>.
68148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
68158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
68168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan<TBD>.
68178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
68188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
68198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNot Implemented error.
68208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
68218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
68228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
68238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
68248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       OMX_IN OMX_U32                        port,
68258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       OMX_IN OMX_PTR                     appData,
68268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       OMX_IN void*                      eglImage)
68278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
68288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
68298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
68308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
6831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)appData;
68328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
68338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_EGL_IMAGE_GPU
68348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
68358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    EGLint fd = -1, offset = 0,pmemPtr = 0;
68368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else
68378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int fd = -1, offset = 0;
68388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
68398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("use EGL image support for decoder");
68408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
68418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("use_EGL_image: Invalid param");
68428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
68438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_EGL_IMAGE_GPU
68448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_display_id == NULL) {
68458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Display ID is not set by IL client");
68468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInsufficientResources;
68478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
68488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
68498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eglGetProcAddress("eglQueryImageKHR");
68508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
68518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
68528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
68538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else //with OMX test app
68548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct temp_egl {
68558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int pmem_fd;
68568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int offset;
68578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    };
68588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct temp_egl *temp_egl_id = NULL;
68598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    void * pmemPtr = (void *) eglImage;
68608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    temp_egl_id = (struct temp_egl *)eglImage;
68618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (temp_egl_id != NULL)
68628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
68638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fd = temp_egl_id->pmem_fd;
68648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        offset = temp_egl_id->offset;
68658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
68668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
68678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (fd < 0) {
68688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd);
68698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInsufficientResources;
68708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
68718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pmem_info.pmem_fd = (OMX_U32) fd;
68728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pmem_info.offset = (OMX_U32) offset;
68738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pmem_entry.entry = (void *) &pmem_info;
68748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
68758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pmem_list.entryList = &pmem_entry;
68768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pmem_list.nEntries = 1;
68778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    ouput_egl_buffers = true;
68788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
68798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
68808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (OMX_U8 *)pmemPtr)) {
68818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("use buffer call failed for egl image");
68828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
68838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
68848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
68858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
68868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
68878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
68888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
68898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::ComponentRoleEnum
68908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
68918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
68928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Component Role Enum method implementation.
68938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
68948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
68958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan<TBD>.
68968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
68978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
68988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None if everything is successful.
68998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
69008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
69018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                             OMX_OUT OMX_U8*        role,
69028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                             OMX_IN OMX_U32        index)
69038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
69048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
6905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)hComp;
69068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevchybrid",OMX_MAX_STRINGNAME_SIZE) ||
69088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevcswvdec",OMX_MAX_STRINGNAME_SIZE) ||
69098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE))
69108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
69118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if((0 == index) && role)
69128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
69138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            strlcpy((char *)role, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
69148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
69158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
69168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
69178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
69188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
69198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorNoMore;
69208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
69218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
69228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
69238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
69248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component");
69258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorInvalidComponentName;
69268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
69278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
69288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
69298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
69348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
69358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::AllocateDone
69368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
69388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanChecks if entire buffer pool is allocated by IL Client or not.
69398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNeed this to move to IDLE state.
69408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
69428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
69438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
69458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false.
69468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
69488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::allocate_done(void)
69498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
69508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = false;
69518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet_In = false;
69528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet_Out = false;
69538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bRet_In = allocate_input_done();
69558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bRet_Out = allocate_output_done();
69568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(bRet_In && bRet_Out)
69588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
69598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bRet = true;
69608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_pSwVdec && m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
69618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
69628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (allocate_interm_buffer(drv_ctx.interm_op_buf.buffer_size) != OMX_ErrorNone)
69638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
69648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                omx_report_error();
69658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bRet = false;
69668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
69678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
69688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
69698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return bRet;
69718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
69728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
69738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
69748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::AllocateInputDone
69758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
69778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanChecks if I/P buffer pool is allocated by IL Client or not.
69788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
69808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
69818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
69838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false.
69848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
69868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::allocate_input_done(void)
69878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
69888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = false;
69898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned i=0;
69908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
69918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_inp_mem_ptr == NULL)
69928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
69938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return bRet;
69948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
69958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_inp_mem_ptr )
69968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
69978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for(;i<drv_ctx.ip_buf.actualcount;i++)
69988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
69998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(BITMASK_ABSENT(&m_inp_bm_count,i))
70008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
70018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
70028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
70038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
70048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
70058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(i == drv_ctx.ip_buf.actualcount)
70068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
70078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bRet = true;
70088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
70098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
70108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled)
70118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
70128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_inp_bPopulated = OMX_TRUE;
70138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
70148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return bRet;
70158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
70168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
70178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
70188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::AllocateOutputDone
70198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
70218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanChecks if entire O/P buffer pool is allocated by IL Client or not.
70228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
70248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
70258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
70278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false.
70288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
70308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::allocate_output_done(void)
70318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
70328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = false;
70338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned j=0;
70348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_out_mem_ptr == NULL)
70368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
70378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return bRet;
70388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
70398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_out_mem_ptr)
70418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
70428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for(;j < drv_ctx.op_buf.actualcount;j++)
70438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
70448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(BITMASK_ABSENT(&m_out_bm_count,j))
70458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
70468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
70478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
70488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
70498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
70508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(j == drv_ctx.op_buf.actualcount)
70528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
70538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bRet = true;
70548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
70558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_out_bEnabled)
70568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_out_bPopulated = OMX_TRUE;
70578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
70588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return bRet;
70608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
70618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
70638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
70648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::ReleaseDone
70658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
70678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanChecks if IL client has released all the buffers.
70688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
70708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
70718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
70738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
70748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
70768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::release_done(void)
70778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
70788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = false;
70798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(release_input_done())
70818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
70828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(release_output_done())
70838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
70848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bRet = true;
70858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
70868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
70878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (bRet && m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
70898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
70908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bRet = release_interm_done();
70918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
70928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return bRet;
70938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
70948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
70958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::release_interm_done(void)
70968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
70978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = true;
70988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned int i=0;
70998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!drv_ctx.ptr_interm_outputbuffer) return bRet;
71018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
71038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for(; (i<drv_ctx.interm_op_buf.actualcount) && drv_ctx.ptr_interm_outputbuffer[i].pmem_fd ; i++)
71048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
71058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_interm_buf_state[i] != WITH_COMPONENT)
71068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
71078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bRet = false;
71088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("interm buffer i %d state %d",i, m_interm_buf_state[i]);
71098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
71108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
71118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
71128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
71138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("release_interm_done %d",bRet);
71158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return bRet;
71168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
71178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
71208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
71218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::ReleaseOutputDone
71228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
71248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanChecks if IL client has released all the buffers.
71258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
71278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
71288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
71308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
71318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
71338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::release_output_done(void)
71348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
71358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = false;
71368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned i=0,j=0;
71378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p",m_out_mem_ptr);
71398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_out_mem_ptr)
71408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
71418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for(;j < drv_ctx.op_buf.actualcount ; j++)
71428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
71438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(BITMASK_PRESENT(&m_out_bm_count,j))
71448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
71458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
71468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
71478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
71488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(j == drv_ctx.op_buf.actualcount)
71498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
71508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_out_bm_count = 0;
71518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bRet = true;
71528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
71538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
71548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
71558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
71568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_out_bm_count = 0;
71578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bRet = true;
71588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
71598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return bRet;
71608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
71618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
71628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
71638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::ReleaseInputDone
71648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
71668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanChecks if IL client has released all the buffers.
71678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
71698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
71708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
71728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
71738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
71758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::release_input_done(void)
71768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
71778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = false;
71788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned i=0,j=0;
71798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
71808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
71818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_inp_mem_ptr)
71828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
71838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for(;j<drv_ctx.ip_buf.actualcount;j++)
71848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
71858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if( BITMASK_PRESENT(&m_inp_bm_count,j))
71868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
71878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
71888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
71898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
71908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(j==drv_ctx.ip_buf.actualcount)
71918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
71928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bRet = true;
71938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
71948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
71958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
71968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
71978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bRet = true;
71988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
71998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return bRet;
72008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
72018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
72028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
72038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                         OMX_BUFFERHEADERTYPE * buffer)
72048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
7205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (!buffer)
72068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
72078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer);
72088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
72098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
7210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long int nPortIndex = buffer - m_out_mem_ptr;
7211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
7212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (nPortIndex >= drv_ctx.op_buf.actualcount)
7213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
7214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("[FBD] ERROR in port idx(%ld), act cnt(%d)",
7215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               nPortIndex, (int)drv_ctx.op_buf.actualcount);
7216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return OMX_ErrorBadParameter;
7217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
72188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (output_flush_progress)
72198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
72208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
72218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFilledLen = 0;
72228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nTimeStamp = 0;
72238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
72248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
72258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
72268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
72278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
72288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p idx %d, TS %lld nFlags %lu",
72298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer, buffer->pBuffer, buffer - m_out_mem_ptr, buffer->nTimeStamp, buffer->nFlags );
72308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pending_output_buffers --;
72318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
72328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
72338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
72348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Output EOS has been reached");
72358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!output_flush_progress)
72368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            post_event((unsigned)NULL, (unsigned)NULL,
72378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_COMPONENT_GENERATE_EOS_DONE);
72388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
72398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (psource_frame)
72408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
72418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
72428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            psource_frame = NULL;
72438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
72448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pdest_frame)
72458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
72468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pdest_frame->nFilledLen = 0;
7247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_input_free_q.insert_entry((unsigned long) pdest_frame,(unsigned long)NULL,
7248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (unsigned long)NULL);
72498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pdest_frame = NULL;
72508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
72518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
72528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
72538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.out_buffer_log)
72548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
72558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        log_output_buffers(buffer);
72568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
72578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
72588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /* For use buffer we need to copy the data */
72598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!output_flush_progress)
72608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
72618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        time_stamp_dts.get_next_timestamp(buffer,
72628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
72638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ?true:false);
72648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_debug_timestamp)
72658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
72668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
72678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_TICKS expected_ts = 0;
72688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_timestamp_list.pop_min_ts(expected_ts);
72698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
72708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    buffer->nTimeStamp, expected_ts);
72718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
72728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (buffer->nTimeStamp != expected_ts)
72738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
72748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check");
72758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
72768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
72778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
72788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
72798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_cb.FillBufferDone)
72808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
72818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (buffer->nFilledLen > 0)
72828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
72838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            handle_extradata(buffer);
72848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (client_extradata & OMX_TIMEINFO_EXTRADATA)
72858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Keep min timestamp interval to handle corrupted bit stream scenario
72868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                set_frame_rate(buffer->nTimeStamp);
72878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if (arbitrary_bytes)
72888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                adjust_timestamp(buffer->nTimeStamp);
72898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (perf_flag)
72908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
72918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (!proc_frms)
72928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
72938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    dec_time.stop();
72948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    latency = dec_time.processing_time_us() - latency;
72958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
72968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    dec_time.start();
72978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    fps_metrics.start();
72988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
72998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                proc_frms++;
73008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
73018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
73028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    OMX_U64 proc_time = 0;
73038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    fps_metrics.stop();
73048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    proc_time = fps_metrics.processing_time_us();
73058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
73068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        proc_frms, (float)proc_time / 1e6,
73078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (float)(1e6 * proc_frms) / proc_time);
73088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    proc_frms = 0;
73098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
73108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
73118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
73128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef OUTPUT_EXTRADATA_LOG
73138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (outputExtradataFile)
73148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
73158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
73168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
73178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                p_extra = (OMX_OTHER_EXTRADATATYPE *)
73188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    ((unsigned)(buffer->pBuffer + buffer->nOffset +
73198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    buffer->nFilledLen + 3)&(~3));
73208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                while(p_extra &&
73218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) )
73228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
73238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
73248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
73258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (p_extra->eType == OMX_ExtraDataNone)
73268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
73278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        break;
73288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
73298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
73308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
73318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
73328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
73338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
73348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (buffer->nFlags & OMX_BUFFERFLAG_EOS){
73358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            prev_ts = LLONG_MAX;
73368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            rst_prev_ts = true;
73378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
73388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
73398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
73408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
73418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer->pPlatformPrivate)->entryList->entry;
73428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %lu", pPMEMInfo->pmem_fd);
73438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_BUFFERHEADERTYPE *il_buffer;
73448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        il_buffer = client_buffers.get_il_buf_hdr(buffer);
73458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
73468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (dynamic_buf_mode && !secure_mode &&
73478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            !(buffer->nFlags & OMX_BUFFERFLAG_READONLY))
73488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
73498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("swvdec_fill_buffer_done rmd ref frame");
73508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf_ref_remove(drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd,
73518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[nPortIndex].offset);
73528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
73538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (il_buffer)
73548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
73558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else {
73568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
73578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorBadParameter;
73588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
73598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd);
73608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
73618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
73628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
73638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
73648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
73658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
7366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_swvdec_mode != SWVDEC_MODE_PARSE_DECODE)
7367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
7368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        /* in full sw solution stride doesn't get change with change of
7369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin           resolution, so don't update geomatry in case of full sw */
7370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_smoothstreaming_mode && m_out_mem_ptr) {
7371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_U32 buf_index = buffer - m_out_mem_ptr;
7372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            BufferDim_t dim;
7373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            private_handle_t *private_handle = NULL;
7374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            dim.sliceWidth = drv_ctx.video_resolution.frame_width;
7375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            dim.sliceHeight = drv_ctx.video_resolution.frame_height;
7376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (native_buffer[buf_index].privatehandle)
7377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                private_handle = native_buffer[buf_index].privatehandle;
7378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (private_handle) {
7379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_LOW("set metadata: update buf-geometry with stride %d slice %d",
7380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    dim.sliceWidth, dim.sliceHeight);
7381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                setMetaData(private_handle, UPDATE_BUFFER_GEOMETRY, (void*)&dim);
7382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
73838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
73848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
73858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
73868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
73878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
73888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
73898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
73908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
73918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          OMX_BUFFERHEADERTYPE* buffer)
73928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
73938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
73948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > (int)drv_ctx.ip_buf.actualcount))
73958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
73968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer);
73978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
73988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
73998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
74018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer, buffer->pBuffer);
74028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pending_input_buffers--;
74038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (arbitrary_bytes)
74058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
74068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pdest_frame == NULL && input_flush_progress == false)
74078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
74088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer);
74098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pdest_frame = buffer;
74108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer->nFilledLen = 0;
74118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer->nTimeStamp = LLONG_MAX;
74128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            push_input_buffer (hComp);
74138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
74148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
74158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
74168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer);
74178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer->nFilledLen = 0;
7418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (!m_input_free_q.insert_entry((unsigned long)buffer,
7419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (unsigned long)NULL, (unsigned long)NULL))
74208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
74218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error");
74228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
74238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
74248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
74258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if(m_cb.EmptyBufferDone)
74268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
74278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFilledLen = 0;
74288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (input_use_buffer == true){
74298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
74308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
74318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
74328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
74338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
74348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
74358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid dump_buffer(FILE* pFile, char* buffer, int stride, int scanlines, int width, int height)
74388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
74398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer)
74408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
74418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        char *temp = (char *)buffer;
74428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int i;
74438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int bytes_written = 0;
74448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int bytes = 0;
74458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for (i = 0; i < height; i++) {
74478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bytes_written = fwrite(temp, width, 1, pFile);
74488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            temp += stride;
74498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (bytes_written >0)
74508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bytes += bytes_written * width;
74518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
74528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        temp = (char *)buffer + stride * scanlines;
74538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int stride_c = stride;
74548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for(i = 0; i < height/2; i++) {
74558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bytes_written = fwrite(temp, width, 1, pFile);
74568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            temp += stride_c;
74578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (bytes_written >0)
74588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bytes += bytes_written * width;
74598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
74608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("stride %d, scanlines %d, frame_height %d bytes_written %d",
74628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            stride, scanlines, height, bytes);
74638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
74648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
74658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint omx_vdec::async_message_process (void *context, void* message)
74678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
74688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx_vdec* omx = NULL;
74698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_msginfo *vdec_msg = NULL;
74708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
74718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_buffer *v4l2_buf_ptr = NULL;
74728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_output_frameinfo *output_respbuf = NULL;
74738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int rc=1;
74748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (context == NULL || message == NULL)
74758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
74768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check");
74778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return -1;
74788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
74798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    vdec_msg = (struct vdec_msginfo *)message;
74808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx = reinterpret_cast<omx_vdec*>(context);
74828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    switch (vdec_msg->msgcode)
74848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
74858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_EVT_HW_ERROR:
7487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        omx->post_event ((unsigned long)NULL, (unsigned long)vdec_msg->status_code,\
7488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
74898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
74908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_RESP_START_DONE:
7492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        omx->post_event ((unsigned long)NULL, (unsigned long)vdec_msg->status_code,\
7493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)OMX_COMPONENT_GENERATE_START_DONE);
74948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
74958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_RESP_STOP_DONE:
7497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        omx->post_event ((unsigned long)NULL, (unsigned long)vdec_msg->status_code,\
7498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)OMX_COMPONENT_GENERATE_STOP_DONE);
74998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
75008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
75018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_RESP_RESUME_DONE:
7502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        omx->post_event ((unsigned long)NULL, (unsigned long)vdec_msg->status_code,\
7503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)OMX_COMPONENT_GENERATE_RESUME_DONE);
75048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
75058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
75068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_RESP_PAUSE_DONE:
7507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        omx->post_event ((unsigned long)NULL, (unsigned long)vdec_msg->status_code,\
7508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)OMX_COMPONENT_GENERATE_PAUSE_DONE);
75098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
75108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
75118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
7512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        omx->post_event ((unsigned long)NULL, (unsigned long)vdec_msg->status_code,\
7513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
75148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
75158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
75168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!omx->m_pSwVdec)
75178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
7518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            omx->post_event ((unsigned)NULL, (unsigned long)vdec_msg->status_code,\
7519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (unsigned long)OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
75208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
75218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
75228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
7523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            omx->post_event ((unsigned)NULL, (unsigned long)vdec_msg->status_code,\
7524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (unsigned long)OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH_DSP);
75258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
75268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
75278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_RESP_INPUT_FLUSHED:
75288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
75298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
75308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /* omxhdr = (OMX_BUFFERHEADERTYPE* )
75318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        vdec_msg->msgdata.input_frame_clientdata; */
75328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
75338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
75348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
75358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (omxhdr == NULL ||
75368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ((omxhdr - omx->m_inp_mem_ptr) > (int)omx->drv_ctx.ip_buf.actualcount) )
75378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
75388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            omxhdr = NULL;
75398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            vdec_msg->status_code = VDEC_S_EFATAL;
75408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
75418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED) {
75428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Unsupported input");
75438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            omx->omx_report_error ();
75448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
75458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
75468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR;
75478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
7548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        omx->post_event ((unsigned long)omxhdr, (unsigned long)vdec_msg->status_code,
7549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)OMX_COMPONENT_GENERATE_EBD);
75508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
75518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
75528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int64_t *timestamp;
75538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        timestamp = (int64_t *) malloc(sizeof(int64_t));
75548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (timestamp) {
75558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
7556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            omx->post_event ((unsigned long)timestamp, (unsigned long)vdec_msg->status_code,
7557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (unsigned long)OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
75588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Field dropped time stamp is %lld",
75598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg->msgdata.output_frame.time_stamp);
75608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
75618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
75628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_RESP_OUTPUT_FLUSHED:
75638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
75648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
75658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            int actualcount = omx->drv_ctx.op_buf.actualcount;
75668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_BUFFERHEADERTYPE* p_mem_ptr  = omx->m_out_mem_ptr;
75678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            vdec_output_frameinfo* ptr_respbuffer = omx->drv_ctx.ptr_respbuffer;
75688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (omx->m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
75698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
75708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                actualcount = omx->drv_ctx.interm_op_buf.actualcount;
75718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                p_mem_ptr  = omx->m_interm_mem_ptr;
75728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                ptr_respbuffer = omx->drv_ctx.ptr_interm_respbuffer;
75738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
75748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
75758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            omxhdr=p_mem_ptr+v4l2_buf_ptr->index;
75768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) pBuffer (%p) idx %d Ts(%lld) Pic_type(%u) frame.len(%d)",
75778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                omxhdr, omxhdr->pBuffer, v4l2_buf_ptr->index, vdec_msg->msgdata.output_frame.time_stamp,
75788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg->msgdata.output_frame.pic_type, vdec_msg->msgdata.output_frame.len);
75798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
75808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (omxhdr && omxhdr->pOutputPortPrivate &&
75818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                ((omxhdr - p_mem_ptr) < actualcount) &&
75828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
75838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                - ptr_respbuffer) < actualcount))
75848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
75858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if ((omx->m_pSwVdec == NULL) &&
75868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    omx->dynamic_buf_mode &&
75878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    vdec_msg->msgdata.output_frame.len)
75888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
75898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    vdec_msg->msgdata.output_frame.len = omxhdr->nAllocLen;
75908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
75918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if ( vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen)
75928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
75938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
75948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
75958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
75968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    omxhdr->nFlags = 0;
75978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
75988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) {
75998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
76008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        //rc = -1;
76018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
76028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (omxhdr->nFilledLen) {
76038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
76048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
76058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) {
76068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
76078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    } else {
76088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME;
76098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
76108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
76118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
76128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
76138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) {
76148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY;
76158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
76168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_READONLY)
76178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
76188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_READONLY;
76198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
76208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) &&
76218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) &&
76228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS)) {
76238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omx->time_stamp_dts.remove_time_stamp(
76248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                omxhdr->nTimeStamp,
76258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                (omx->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
76268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                ?true:false);
7627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        omx->post_event ((unsigned long)NULL,(unsigned long)omxhdr,
7628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                (unsigned long)OMX_COMPONENT_GENERATE_FTB);
76298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        break;
76308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
76318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
76328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
76338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
76348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    vdec_msg->msgdata.output_frame.bufferaddr =
76358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
76368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    int format_notably_changed = 0;
76378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (omxhdr->nFilledLen &&
76388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            (omxhdr->nFilledLen != (unsigned)omx->prev_n_filled_len)) {
76398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if ((vdec_msg->msgdata.output_frame.framesize.bottom != omx->drv_ctx.video_resolution.frame_height) ||
76408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                (vdec_msg->msgdata.output_frame.framesize.right != omx->drv_ctx.video_resolution.frame_width)) {
76418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_HIGH("Height/Width information has changed");
76428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            omx->drv_ctx.video_resolution.frame_height = vdec_msg->msgdata.output_frame.framesize.bottom;
76438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            omx->drv_ctx.video_resolution.frame_width = vdec_msg->msgdata.output_frame.framesize.right;
76448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            format_notably_changed = 1;
76458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
76468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
76478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft !=
76488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        vdec_msg->msgdata.output_frame.framesize.left)
76498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top)
76508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right)
76518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) {
76528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if ((vdec_msg->msgdata.output_frame.framesize.bottom != omx->drv_ctx.video_resolution.frame_height) ||
76538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                (vdec_msg->msgdata.output_frame.framesize.right != omx->drv_ctx.video_resolution.frame_width)) {
76548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            omx->drv_ctx.video_resolution.frame_height = vdec_msg->msgdata.output_frame.framesize.bottom;
76558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            omx->drv_ctx.video_resolution.frame_width = vdec_msg->msgdata.output_frame.framesize.right;
76568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_HIGH("Height/Width information has changed. W: %d --> %d, H: %d --> %d",
76578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    omx->drv_ctx.video_resolution.frame_width, vdec_msg->msgdata.output_frame.framesize.right,
76588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    omx->drv_ctx.video_resolution.frame_height, vdec_msg->msgdata.output_frame.framesize.bottom);
76598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
76608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("Crop information changed. W: %lu --> %d, H: %lu -> %d",
76618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                omx->rectangle.nWidth, vdec_msg->msgdata.output_frame.framesize.right,
76628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                omx->rectangle.nHeight, vdec_msg->msgdata.output_frame.framesize.bottom);
76638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (vdec_msg->msgdata.output_frame.framesize.left + vdec_msg->msgdata.output_frame.framesize.right >=
76648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            omx->drv_ctx.video_resolution.frame_width) {
76658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            vdec_msg->msgdata.output_frame.framesize.left = 0;
76668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if (vdec_msg->msgdata.output_frame.framesize.right > omx->drv_ctx.video_resolution.frame_width) {
76678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                vdec_msg->msgdata.output_frame.framesize.right =  omx->drv_ctx.video_resolution.frame_width;
76688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
76698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
76708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (vdec_msg->msgdata.output_frame.framesize.top + vdec_msg->msgdata.output_frame.framesize.bottom >=
76718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            omx->drv_ctx.video_resolution.frame_height) {
76728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            vdec_msg->msgdata.output_frame.framesize.top = 0;
76738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if (vdec_msg->msgdata.output_frame.framesize.bottom > omx->drv_ctx.video_resolution.frame_height) {
76748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                vdec_msg->msgdata.output_frame.framesize.bottom =  omx->drv_ctx.video_resolution.frame_height;
76758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
76768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
76778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("omx_vdec: Adjusted Dim L: %d, T: %d, R: %d, B: %d, W: %d, H: %d",
76788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        vdec_msg->msgdata.output_frame.framesize.left,
76798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        vdec_msg->msgdata.output_frame.framesize.top,
76808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        vdec_msg->msgdata.output_frame.framesize.right,
76818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        vdec_msg->msgdata.output_frame.framesize.bottom,
76828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        omx->drv_ctx.video_resolution.frame_width,
76838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        omx->drv_ctx.video_resolution.frame_height);
76848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
76858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top;
76868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
76878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
76888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        format_notably_changed = 1;
76898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
76908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Left: %d, Right: %d, top: %d, Bottom: %d",
76918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      vdec_msg->msgdata.output_frame.framesize.left,vdec_msg->msgdata.output_frame.framesize.right,
76928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      vdec_msg->msgdata.output_frame.framesize.top, vdec_msg->msgdata.output_frame.framesize.bottom);
76938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (format_notably_changed) {
76948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if (omx->is_video_session_supported()) {
7695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            omx->post_event ((unsigned long)0, (unsigned long)vdec_msg->status_code,
7696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    (unsigned long)OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING);
76978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        } else {
76988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            if (!omx->client_buffers.update_buffer_req()) {
76998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
77008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            }
7701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            omx->post_event ((unsigned long)OMX_CORE_OUTPUT_PORT_INDEX, (unsigned long)OMX_IndexConfigCommonOutputCrop,
7702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                (unsigned long)OMX_COMPONENT_GENERATE_PORT_RECONFIG);
77038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
77048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
77058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (omxhdr->nFilledLen)
77068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omx->prev_n_filled_len = omxhdr->nFilledLen;
77078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
77088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    output_respbuf = (struct vdec_output_frameinfo *)\
77098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omxhdr->pOutputPortPrivate;
77108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    output_respbuf->len = vdec_msg->msgdata.output_frame.len;
77118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
77128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
77138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_I;
77148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
77158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
77168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_P;
77178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
77188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
77198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_B;
77208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
77218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
77228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (omx->output_use_buffer)
77238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        memcpy ( omxhdr->pBuffer, (void *)
77248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
77258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned long)vdec_msg->msgdata.output_frame.offset),
77268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        vdec_msg->msgdata.output_frame.len);
77278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                } else
77288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    omxhdr->nFilledLen = 0;
77298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (!omx->m_pSwVdec)
77308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
7731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    omx->post_event ((unsigned long)omxhdr, (unsigned long)vdec_msg->status_code,
7732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        (unsigned long)OMX_COMPONENT_GENERATE_FBD);
77338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
77348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
77358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
7736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    omx->post_event ((unsigned long)omxhdr, (unsigned long)vdec_msg->status_code,
7737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        (unsigned long)OMX_COMPONENT_GENERATE_FBD_DSP);
77388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
77398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
77408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
7741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                omx->post_event ((unsigned long)NULL, (unsigned long)vdec_msg->status_code,
77428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_COMPONENT_GENERATE_EOS_DONE);
77438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
7744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                omx->post_event ((unsigned long)NULL, (unsigned long)vdec_msg->status_code,
7745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (unsigned long)OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
77468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
77478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
77488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case VDEC_MSG_EVT_CONFIG_CHANGED:
77498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!omx->m_pSwVdec)
77508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
77518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Port settings changed");
7752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            omx->post_event ((unsigned long)OMX_CORE_OUTPUT_PORT_INDEX, (unsigned long)OMX_IndexParamPortDefinition,
7753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (unsigned long)OMX_COMPONENT_GENERATE_PORT_RECONFIG);
77548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
77558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
77568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    default:
77578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
77588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
77598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return rc;
77608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
77618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
77628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
77638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_HANDLETYPE hComp,
77648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer
77658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    )
77668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
77678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned address,p2,id;
77688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Empty this arbitrary");
77698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
77708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer == NULL)
77718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
77728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
77738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
77748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
77758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %lu, flags %lu, timestamp %u",
77768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
77778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
77788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /* return zero length and not an EOS buffer */
77798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /* return buffer if input flush in progress */
77808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
77818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)))
77828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
77838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress");
77848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
77858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorNone;
77868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
77878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
77888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (psource_frame == NULL)
77898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
77908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp);
77918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        psource_frame = buffer;
77928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Try to Push One Input Buffer ");
77938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        push_input_buffer (hComp);
77948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
77958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
77968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
77978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer);
7798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (!m_input_pending_q.insert_entry((unsigned long)buffer, (unsigned long)NULL,
7799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)NULL))
78008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
78018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorBadParameter;
78028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
78038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
78048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
78058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
78068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
78078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
78088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
78098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
78108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
7811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long address,p2,id;
78128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
78138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
78148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (pdest_frame == NULL || psource_frame == NULL)
78158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
78168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*Check if we have a destination buffer*/
78178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pdest_frame == NULL)
78188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
78198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Get a Destination buffer from the queue");
78208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_input_free_q.m_size)
78218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
78228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_input_free_q.pop_entry(&address,&p2,&id);
78238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
78248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pdest_frame->nFilledLen = 0;
78258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pdest_frame->nTimeStamp = LLONG_MAX;
78268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame);
78278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
78288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
78298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
78308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*Check if we have a destination buffer*/
78318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (psource_frame == NULL)
78328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
78338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Get a source buffer from the queue");
78348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_input_pending_q.m_size)
78358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
78368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_input_pending_q.pop_entry(&address,&p2,&id);
78378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                psource_frame = (OMX_BUFFERHEADERTYPE *)address;
78388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame,
78398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    psource_frame->nTimeStamp);
78408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer flag %lu length %lu",
78418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    psource_frame->nFlags,psource_frame->nFilledLen);
78428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
78438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
78448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
78458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
78468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
78478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
78488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while ((pdest_frame != NULL) && (psource_frame != NULL))
78498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
78508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        switch (codec_type_parse)
78518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
78528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case CODEC_TYPE_HEVC:
78538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ret = push_input_hevc(hComp);
78548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
78558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        default:
78568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
78578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
78588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ret != OMX_ErrorNone)
78598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
78608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Pushing input Buffer Failed");
78618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            omx_report_error ();
78628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
78638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
78648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
78658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
78668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return ret;
78678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
78688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
78698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc)
78708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
78718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE rc = OMX_ErrorNone;
78728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen)
78738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
78748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memcpy ((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen);
78758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pDst->nTimeStamp == LLONG_MAX)
78768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
78778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pDst->nTimeStamp = pSrc->nTimeStamp;
78788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Assign Dst nTimeStamp=%lld", pDst->nTimeStamp);
78798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
78808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pDst->nFilledLen += pSrc->nFilledLen;
78818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pSrc->nFilledLen = 0;
78828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
78838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
78848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
78858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Destination buffer overflow");
78868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rc = OMX_ErrorBadParameter;
78878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
78888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return rc;
78898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
78908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
78918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::push_input_hevc (OMX_HANDLETYPE hComp)
78928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
78938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 partial_frame = 1;
7894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long address,p2,id;
78958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BOOL isNewFrame = OMX_FALSE;
78968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
78978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE rc = OMX_ErrorNone;
78988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
78998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (h264_scratch.pBuffer == NULL)
79008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
79018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated");
79028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
79038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
79048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
79058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
79068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("h264_scratch.nFilledLen %lu has look_ahead_nal %d pdest_frame nFilledLen %lu nTimeStamp %lld",
79078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        h264_scratch.nFilledLen, look_ahead_nal, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
79088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
79098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (h264_scratch.nFilledLen && look_ahead_nal)
79108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
79118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        look_ahead_nal = false;
79128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
79138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // copy the lookahead buffer in the scratch
79148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rc = copy_buffer(pdest_frame, &h264_scratch);
79158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (rc != OMX_ErrorNone)
79168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
79178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return rc;
79188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
79198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
79208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (nal_length == 0)
79218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
79228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_frame_parser.parse_sc_frame(psource_frame,
79238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            &h264_scratch,&partial_frame) == -1)
79248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
79258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
79268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorBadParameter;
79278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
79288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
79298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
79308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
79318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length);
79328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_frame_parser.parse_h264_nallength(psource_frame,
79338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            &h264_scratch,&partial_frame) == -1)
79348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
79358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
79368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorBadParameter;
79378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
79388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
79398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
79408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (partial_frame == 0)
79418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
79428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (nal_count == 0 && h264_scratch.nFilledLen == 0)
79438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
79448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
79458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nal_count++;
79468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
79478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            h264_scratch.nFlags = psource_frame->nFlags;
79488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
79498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
79508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
79518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Parsed New NAL Length = %lu",h264_scratch.nFilledLen);
79528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(h264_scratch.nFilledLen)
79538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
79548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                mHEVCutils.isNewFrame(&h264_scratch, 0, isNewFrame);
79558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                nal_count++;
79568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
79578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
79588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!isNewFrame)
79598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
79608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %lu nTimestamp %lld, pdest_frame nFilledLen %lu nTimestamp %lld",
79618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    h264_scratch.nFilledLen, h264_scratch.nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
79628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                rc = copy_buffer(pdest_frame, &h264_scratch);
79638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if ( rc != OMX_ErrorNone)
79648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
79658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return rc;
79668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
79678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
79688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
79698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
79708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                look_ahead_nal = true;
79718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pdest_frame->nFilledLen == 0)
79728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
79738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    look_ahead_nal = false;
79748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer");
79758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    rc = copy_buffer(pdest_frame, &h264_scratch);
79768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if ( rc != OMX_ErrorNone )
79778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
79788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return OMX_ErrorBadParameter;
79798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
79808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
79818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
79828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
79838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if(psource_frame->nFilledLen || h264_scratch.nFilledLen)
79848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
79858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
79868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
79878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
79888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("FrameDetecetd # %d pdest_frame nFilledLen %lu nTimeStamp %lld, look_ahead_nal in h264_scratch nFilledLen %lu nTimeStamp %lld",
79898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        frame_count++, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
79908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
79918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
79928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return OMX_ErrorBadParameter;
79938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
79948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pdest_frame = NULL;
79958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (m_input_free_q.m_size)
79968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    {
79978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        m_input_free_q.pop_entry(&address,&p2,&id);
79988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
79998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("pop the next pdest_buffer %p",pdest_frame);
80008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pdest_frame->nFilledLen = 0;
80018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pdest_frame->nFlags = 0;
80028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pdest_frame->nTimeStamp = LLONG_MAX;
80038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
80048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
80058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
80068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
80078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
80088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
80098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
80108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %lu nTimeStamp %lld, pdest_frame nFilledLen %lu nTimeStamp %lld, h264_scratch nFilledLen %lu nTimeStamp %lld",
80118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            psource_frame->nFilledLen, psource_frame->nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
80128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
80138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*Check if Destination Buffer is full*/
80148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (h264_scratch.nAllocLen ==
80158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            h264_scratch.nFilledLen + h264_scratch.nOffset)
80168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
80178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
80188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorStreamCorrupt;
80198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
80208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
80218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
80228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!psource_frame->nFilledLen)
80238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
80248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
80258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
80268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)
80278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
80288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (pdest_frame)
80298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
80308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
80318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                rc = copy_buffer(pdest_frame, &h264_scratch);
80328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if ( rc != OMX_ErrorNone )
80338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
80348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return rc;
80358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
80368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
80378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
80388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
80398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
80408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Push EOS frame number:%d nFilledLen =%lu TimeStamp = %lld nFlags %lu",
80418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    frame_count++, pdest_frame->nFilledLen,pdest_frame->nTimeStamp, pdest_frame->nFlags);
80428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
80438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                /*Push the frame to the Decoder*/
80448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone)
80458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
80468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return OMX_ErrorBadParameter;
80478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
80488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pdest_frame = NULL;
80498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
80508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
80518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
80528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %lu frame_count %d",
80538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pdest_frame,h264_scratch.nFilledLen, frame_count);
80548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                generate_ebd = OMX_FALSE;
80558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
80568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
80578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
80588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(generate_ebd && !psource_frame->nFilledLen)
80598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
80608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
80618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        psource_frame = NULL;
80628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_input_pending_q.m_size)
80638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
80648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_input_pending_q.pop_entry(&address,&p2,&id);
80658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
80668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Next source Buffer flag %lu nFilledLen %lu, nTimeStamp %lld",
80678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                psource_frame->nFlags,psource_frame->nFilledLen, psource_frame->nTimeStamp);
80688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
80698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
80708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
80718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
80728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
80738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
80748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                  OMX_U32 alignment)
80758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
80768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct pmem_allocation allocation;
80778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    allocation.size = buffer_size;
80788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    allocation.align = clip2(alignment);
80798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (allocation.align < 4096)
80808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
80818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        allocation.align = 4096;
80828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
80838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
80848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
80858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)",
80868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            allocation.align, allocation.size);
80878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return false;
80888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
80898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return true;
80908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
80918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
80928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
80938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                   OMX_U32 alignment, struct ion_allocation_data *alloc_data,
80948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstruct ion_fd_data *fd_data, int flag, int heap_id)
80958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
80968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int fd = -EINVAL;
80978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int rc = -EINVAL;
80988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int ion_dev_flag;
80998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_ion ion_buf_info;
81008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!alloc_data || buffer_size <= 0 || !fd_data) {
81018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory");
81028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return -EINVAL;
81038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
81048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    ion_dev_flag = O_RDONLY;
81058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    fd = open (MEM_DEVICE, ion_dev_flag);
81068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (fd < 0) {
81078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd);
81088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return fd;
81098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
81108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    alloc_data->flags = 0;
81118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!secure_mode && (flag & ION_FLAG_CACHED))
81128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
81138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        alloc_data->flags |= ION_FLAG_CACHED;
81148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
81158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    alloc_data->len = buffer_size;
81168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    alloc_data->align = clip2(alignment);
81178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (alloc_data->align < 4096)
81188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
81198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        alloc_data->align = 4096;
81208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
81218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((secure_mode) && (flag & ION_SECURE))
81228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        alloc_data->flags |= ION_SECURE;
81238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
81258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!secure_mode && heap_id)
8126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        alloc_data->heap_id_mask = ION_HEAP(heap_id);
81278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
81288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ION ALLOC memory heap_id %d mask %0xx size %d align %d",
8129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        heap_id, (unsigned int)alloc_data->heap_id_mask, alloc_data->len, alloc_data->align);
81308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
81318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (rc || !alloc_data->handle) {
81328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION ALLOC memory failed ");
81338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        alloc_data->handle = 0;
81348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        close(fd);
81358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fd = -ENOMEM;
81368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return fd;
81378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
81388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    fd_data->handle = alloc_data->handle;
81398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    rc = ioctl(fd,ION_IOC_MAP,fd_data);
81408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (rc) {
81418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION MAP failed ");
81428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ion_buf_info.ion_alloc_data = *alloc_data;
81438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ion_buf_info.ion_device_fd = fd;
81448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ion_buf_info.fd_ion_data = *fd_data;
81458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free_ion_memory(&ion_buf_info);
81468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fd_data->fd =-1;
81478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        close(fd);
81488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fd = -ENOMEM;
81498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
81508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
81518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return fd;
81528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
81538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
81548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info) {
81558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
81568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!buf_ion_info) {
81578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata");
81588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
81598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
81608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
81618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        &buf_ion_info->ion_alloc_data.handle)) {
81628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ION: free failed" );
81638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
81648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
81658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    close(buf_ion_info->ion_device_fd);
81668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buf_ion_info->ion_device_fd = -1;
81678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buf_ion_info->ion_alloc_data.handle = 0;
81688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buf_ion_info->fd_ion_data.fd = -1;
81698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
81708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
81718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::free_output_buffer_header()
81728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
81738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ALL output buffers are freed/released");
81748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    output_use_buffer = false;
81758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    ouput_egl_buffers = false;
81768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
81778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_out_mem_ptr)
81788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
81798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free (m_out_mem_ptr);
81808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_out_mem_ptr = NULL;
81818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
81828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
81838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_platform_list)
81848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
81858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(m_platform_list);
81868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_platform_list = NULL;
81878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
81888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
81898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.ptr_respbuffer)
81908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
81918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free (drv_ctx.ptr_respbuffer);
81928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_respbuffer = NULL;
81938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
81948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.ptr_outputbuffer)
81958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
81968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free (drv_ctx.ptr_outputbuffer);
81978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_outputbuffer = NULL;
81988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
81998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
82008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.op_buf_ion_info) {
82018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free o/p ion context");
82028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(drv_ctx.op_buf_ion_info);
82038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.op_buf_ion_info = NULL;
82048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
82058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
82068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (out_dynamic_list) {
82078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(out_dynamic_list);
82088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        out_dynamic_list = NULL;
82098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
82108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
82118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::free_input_buffer_header()
82138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
82148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    input_use_buffer = false;
82158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (arbitrary_bytes)
82168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
82178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_frame_parser.mutils)
82188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
82198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free utils parser");
82208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            delete (m_frame_parser.mutils);
82218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_frame_parser.mutils = NULL;
82228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
82238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_inp_heap_ptr)
82258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
82268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free input Heap Pointer");
82278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            free (m_inp_heap_ptr);
82288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_inp_heap_ptr = NULL;
82298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
82308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_phdr_pmem_ptr)
82328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
82338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free input pmem header Pointer");
82348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            free (m_phdr_pmem_ptr);
82358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_phdr_pmem_ptr = NULL;
82368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
82378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
82388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_inp_mem_ptr)
82398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
82408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free input pmem Pointer area");
82418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free (m_inp_mem_ptr);
82428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_inp_mem_ptr = NULL;
82438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
82448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while (m_input_free_q.m_size) {
8245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned long address, p2, id;
82468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_input_free_q.pop_entry(&address, &p2, &id);
82478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
82488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.ptr_inputbuffer)
82498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
82508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Driver Context pointer");
82518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free (drv_ctx.ptr_inputbuffer);
82528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_inputbuffer = NULL;
82538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
82548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
82558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.ip_buf_ion_info) {
82568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free ion context");
82578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(drv_ctx.ip_buf_ion_info);
82588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ip_buf_ion_info = NULL;
82598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
82608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
82618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
82628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint omx_vdec::stream_off(OMX_U32 port)
82648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
82658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    enum v4l2_buf_type btype;
82668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int rc = 0;
82678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    enum v4l2_ports v4l2_port = OUTPUT_PORT;
82688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
82708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
82718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        v4l2_port = OUTPUT_PORT;
82728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
82738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
82748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        v4l2_port = CAPTURE_PORT;
82758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (port == OMX_ALL) {
82768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
82778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
82788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!rc_input)
82808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return rc_input;
82818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
82828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return rc_output;
82838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
82848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!streaming[v4l2_port]) {
82868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // already streamed off, warn and move on
82878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
82888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            " which is already streamed off", v4l2_port);
82898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return 0;
82908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
82918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
82938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
82958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (rc) {
82968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*TODO: How to handle this case */
82978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port);
82988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else {
82998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        streaming[v4l2_port] = false;
83008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
83018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
83028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return rc;
83038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
83048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
83058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
83068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
83078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
83088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_requestbuffers bufreq;
83098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
83108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_format fmt;
83118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int ret = 0;
83128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
83138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bufreq.memory = V4L2_MEMORY_USERPTR;
83148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bufreq.count = 1;
83158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){
83168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
83178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
83188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
83198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT){
83208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
83218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
83228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
83238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }else {eRet = OMX_ErrorBadParameter;}
83248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(eRet==OMX_ErrorNone){
83258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
83268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
83278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(ret)
83288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
83298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
83308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*TODO: How to handle this case */
83318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
83328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return eRet;
83338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
83348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
83358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
83368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer_prop->actualcount = bufreq.count;
83378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer_prop->mincount = bufreq.count;
83388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Count = %d",bufreq.count);
83398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
83408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("GetBufReq: ActCnt(%d) Size(%d), BufType(%d)",
83418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
83428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
83438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
83448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
83458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
83468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
83478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
83488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    update_resolution(fmt.fmt.pix_mp.width,
83498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.height,
83508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.plane_fmt[0].bytesperline,
83518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.plane_fmt[0].reserved[0]);
83528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
83538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
83548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Buffer Size (plane[0].sizeimage) = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
83558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
83568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(ret)
83578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
83588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        /*TODO: How to handle this case */
83598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
83608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
83618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
83628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
83638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
83648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int extra_idx = 0;
83658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
83668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = is_video_session_supported();
83678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (eRet)
83688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return eRet;
83698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
83708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
83718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf_size = buffer_prop->buffer_size;
83728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
83738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
83748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
83758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if (extra_idx >= VIDEO_MAX_PLANES) {
83768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
83778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorBadParameter;
83788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
83798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
83808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
83818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Frame info extra data enabled!");
83828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
83838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
83848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (client_extradata & OMX_INTERLACE_EXTRADATA)
83858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
83868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
83878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
83888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (client_extradata & OMX_PORTDEF_EXTRADATA)
83898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
83908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
83918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d",
83928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                client_extra_data_size);
83938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
83948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (client_extra_data_size)
83958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
83968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
83978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
83988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
83998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size;
84008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.extradata_info.count = buffer_prop->actualcount;
84018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.extradata_info.buffer_size = extra_data_size;
84028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf_size += client_extra_data_size;
84038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
84048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d), extradata size %d",
84058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type, client_extra_data_size);
84068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (in_reconfig) // BufReq will be set to driver when port is disabled
84078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer_prop->buffer_size = buf_size;
84088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if (buf_size != buffer_prop->buffer_size)
84098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
84108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer_prop->buffer_size = buf_size;
84118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = set_buffer_req(buffer_prop);
84128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
84138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
84148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("GetBufReq OUT: ActCnt(%d) Size(%d), BufType(%d)",
84158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
84168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
84178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
84188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
84198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
84208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
84218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
84228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned buf_size = 0;
84238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_format fmt;
84248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_requestbuffers bufreq;
84258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int ret;
84268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
84278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer_prop->actualcount, buffer_prop->buffer_size);
84288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
84298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buf_size != buffer_prop->buffer_size)
84308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
84318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
84328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer_prop->buffer_size, buf_size);
84338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorBadParameter;
84348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
84358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
84368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
84378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
84388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
84398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
84408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT){
84418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
84428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fmt.fmt.pix_mp.pixelformat = output_capability;
84438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
84448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
84458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fmt.fmt.pix_mp.pixelformat = capture_capability;
84468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else {
84478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorBadParameter;
84488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
84498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
84508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
84518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ret)
84528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
84538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /*TODO: How to handle this case */
84548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
84558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
84568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
84578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
84588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
84598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufreq.count = buffer_prop->actualcount;
84608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
84618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
84628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
84638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
84648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else {
84658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorBadParameter;
84668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
84678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
84688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (eRet==OMX_ErrorNone) {
84698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
84708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
84718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
84728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ret)
84738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
84748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
84758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /*TODO: How to handle this case */
84768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
84778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if (bufreq.count < buffer_prop->actualcount) {
84788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
84798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                " on v4l2 port %d to %d (prefers %d)", bufreq.type,
84808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buffer_prop->actualcount, bufreq.count);
84818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
84828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
84838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!client_buffers.update_buffer_req()) {
84848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
84858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
84868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
84878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
84888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
84898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!eRet && !m_pSwVdec && buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT)
84908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
84918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // need to update extradata buffers also in pure dsp mode
84928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.extradata_info.size = buffer_prop->actualcount * drv_ctx.extradata_info.buffer_size;
84938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.extradata_info.count = buffer_prop->actualcount;
84948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
84958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
84968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
84978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
84988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::update_picture_resolution()
84998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
85008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
85018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
85028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
85038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
85048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
85058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
85068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
85078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!portDefn)
85088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
85098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
85108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
85118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("omx_vdec::update_portdef");
85128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
85138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    portDefn->nSize = sizeof(portDefn);
85148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    portDefn->eDomain    = OMX_PortDomainVideo;
85158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.frame_rate.fps_denominator > 0)
85168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
85178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.frame_rate.fps_denominator;
85188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else {
85198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Divide by zero");
85208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
85218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
85228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (0 == portDefn->nPortIndex)
85238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
85248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->eDir =  OMX_DirInput;
85258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
85268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
85278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
85288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
85298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->format.video.eCompressionFormat = eCompressionFormat;
85308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->bEnabled   = m_inp_bEnabled;
85318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->bPopulated = m_inp_bPopulated;
85328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
85338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (1 == portDefn->nPortIndex)
85348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
85358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned int buf_size = 0;
85368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!client_buffers.update_buffer_req()) {
85378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed");
85388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorHardware;
85398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
85408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!client_buffers.get_buffer_req(buf_size)) {
85418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("update buffer requirements");
85428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorHardware;
85438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
85448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->nBufferSize = buf_size;
85458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->eDir =  OMX_DirOutput;
85468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
85478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
85488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
85498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->bEnabled   = m_out_bEnabled;
85508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->bPopulated = m_out_bPopulated;
85518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
85528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error in getting color format");
85538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorHardware;
85548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
85558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
85568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
85578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
85588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->eDir = OMX_DirMax;
85598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
85608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (int)portDefn->nPortIndex);
85618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
85628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
85638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
85648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
85658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
85668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
85678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld"
85688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        " SliceHeight = %lu", portDefn->format.video.nFrameWidth,
85698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->format.video.nFrameHeight,
85708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->format.video.nStride,
85718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->format.video.nSliceHeight);
85728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
85738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
85748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
85758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
85768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::allocate_output_headers()
85778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
85788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
85798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
85808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned i= 0;
85818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
85828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!m_out_mem_ptr) {
85838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation");
85848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int nBufHdrSize        = 0;
85858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int nPlatformEntrySize = 0;
85868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int nPlatformListSize  = 0;
85878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int nPMEMInfoSize = 0;
85888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
85898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
85908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
85918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
85928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Setting First Output Buffer(%d)",
85938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.actualcount);
85948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nBufHdrSize        = drv_ctx.op_buf.actualcount *
85958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE);
85968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
85978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
85988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
85998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nPlatformListSize  = drv_ctx.op_buf.actualcount *
86008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
86018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
86028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
86038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
86048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
86058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE),
86068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nPMEMInfoSize,
86078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nPlatformListSize);
86088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("PE %d bmSize %d",nPlatformEntrySize,
86098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_out_bm_count);
86108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
86118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // Alloc mem for platform specific info
86128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        char *pPtr=NULL;
86138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
86148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nPMEMInfoSize,1);
86158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
86168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc (sizeof(struct vdec_bufferpayload),
86178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.actualcount);
86188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
86198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc (sizeof (struct vdec_output_frameinfo),
86208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.op_buf.actualcount);
86218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
86228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
86238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
86248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
86258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (dynamic_buf_mode) {
86268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            out_dynamic_list = (struct dynamic_buf_list *) \
86278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                calloc (sizeof(struct dynamic_buf_list), drv_ctx.op_buf.actualcount);
86288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
86298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
86308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            && drv_ctx.ptr_respbuffer)
86318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
86328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bufHdr          =  m_out_mem_ptr;
86338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
86348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
86358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (((char *) m_platform_list)  + nPlatformListSize);
86368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
86378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (((char *) m_platform_entry) + nPlatformEntrySize);
86388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pPlatformList   = m_platform_list;
86398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pPlatformEntry  = m_platform_entry;
86408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pPMEMInfo       = m_pmem_info;
86418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
86428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
86438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
86448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // Settting the entire storage nicely
86458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr,
86468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_out_mem_ptr,pPlatformEntry);
86478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
86488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            for(i=0; i < drv_ctx.op_buf.actualcount ; i++)
86498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
86508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
86518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
86528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Set the values when we determine the right HxW param
86538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->nAllocLen          = 0;
86548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->nFilledLen         = 0;
86558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->pAppPrivate        = NULL;
86568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
86578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
86588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPlatformEntry->entry      = pPMEMInfo;
86598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Initialize the Platform List
86608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPlatformList->nEntries    = 1;
86618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPlatformList->entryList   = pPlatformEntry;
86628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Keep pBuffer NULL till vdec is opened
86638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->pBuffer            = NULL;
86648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPMEMInfo->offset          =  0;
86658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPMEMInfo->pmem_fd = 0;
86668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->pPlatformPrivate = pPlatformList;
86678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
86688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
86698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
86708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
86718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                /*Create a mapping between buffers*/
86728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
86738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_respbuffer[i].client_data = (void *) \
86748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    &drv_ctx.ptr_outputbuffer[i];
86758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                // Move the buffer and buffer header pointers
86768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                bufHdr++;
86778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPMEMInfo++;
86788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPlatformEntry++;
86798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPlatformList++;
86808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
86818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
86828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
86838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
86848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
86858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_out_mem_ptr, pPtr);
86868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(m_out_mem_ptr)
86878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
86888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free(m_out_mem_ptr);
86898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_out_mem_ptr = NULL;
86908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
86918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(pPtr)
86928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
86938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free(pPtr);
86948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pPtr = NULL;
86958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
86968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(drv_ctx.ptr_outputbuffer)
86978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
86988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free(drv_ctx.ptr_outputbuffer);
86998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer = NULL;
87008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
87018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(drv_ctx.ptr_respbuffer)
87028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
87038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free(drv_ctx.ptr_respbuffer);
87048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_respbuffer = NULL;
87058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
87068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
87078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (drv_ctx.op_buf_ion_info) {
87088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free o/p ion context");
87098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free(drv_ctx.op_buf_ion_info);
87108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.op_buf_ion_info = NULL;
87118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
87128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
87138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet =  OMX_ErrorInsufficientResources;
87148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
87158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else {
87168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet =  OMX_ErrorInsufficientResources;
87178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
87188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
87198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
87208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
87218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::complete_pending_buffer_done_cbs()
87228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
8723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long p1;
8724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long p2;
8725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long ident;
87268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx_cmd_queue tmp_q, pending_bd_q;
87278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
87288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    // pop all pending GENERATE FDB from ftb queue
87298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while (m_ftb_q.m_size)
87308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
87318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_ftb_q.pop_entry(&p1,&p2,&ident);
87328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(ident == OMX_COMPONENT_GENERATE_FBD)
87338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
87348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pending_bd_q.insert_entry(p1,p2,ident);
87358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
87368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
87378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
87388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            tmp_q.insert_entry(p1,p2,ident);
87398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
87408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
87418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //return all non GENERATE FDB to ftb queue
87428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while(tmp_q.m_size)
87438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
87448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        tmp_q.pop_entry(&p1,&p2,&ident);
87458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_ftb_q.insert_entry(p1,p2,ident);
87468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
87478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    // pop all pending GENERATE EDB from etb queue
87488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while (m_etb_q.m_size)
87498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
87508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_etb_q.pop_entry(&p1,&p2,&ident);
87518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(ident == OMX_COMPONENT_GENERATE_EBD)
87528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
87538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pending_bd_q.insert_entry(p1,p2,ident);
87548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
87558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
87568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
87578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            tmp_q.insert_entry(p1,p2,ident);
87588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
87598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
87608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //return all non GENERATE FDB to etb queue
87618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while(tmp_q.m_size)
87628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
87638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        tmp_q.pop_entry(&p1,&p2,&ident);
87648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_etb_q.insert_entry(p1,p2,ident);
87658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
87668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
87678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    // process all pending buffer dones
87688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while(pending_bd_q.m_size)
87698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
87708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pending_bd_q.pop_entry(&p1,&p2,&ident);
87718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        switch(ident)
87728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
87738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case OMX_COMPONENT_GENERATE_EBD:
87748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone)
87758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
87768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!");
87778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                omx_report_error ();
87788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
87798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
87808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
87818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case OMX_COMPONENT_GENERATE_FBD:
87828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone )
87838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
87848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!");
87858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                omx_report_error ();
87868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
87878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
87888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
87898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
87908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
87918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
87928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
87938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
87948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 new_frame_interval = 0;
87958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
87968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000))
87978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
87988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        new_frame_interval = (act_timestamp > prev_ts)?
87998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            act_timestamp - prev_ts :
88008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        prev_ts - act_timestamp;
88018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (new_frame_interval < frm_int || frm_int == 0)
88028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
88038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            frm_int = new_frame_interval;
88048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(frm_int)
88058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
88068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.frame_rate.fps_numerator = 1e6;
88078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.frame_rate.fps_denominator = frm_int;
88088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_frame_rate: frm_int(%lu) fps(%f)",
88098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    frm_int, drv_ctx.frame_rate.fps_numerator /
88108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (float)drv_ctx.frame_rate.fps_denominator);
88118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
88128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
88138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
88148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    prev_ts = act_timestamp;
88158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
88168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
88178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
88188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
88198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (rst_prev_ts && VALID_TS(act_timestamp))
88208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
88218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        prev_ts = act_timestamp;
88228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rst_prev_ts = false;
88238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
88248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (VALID_TS(prev_ts))
88258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
88268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bool codec_cond = (drv_ctx.timestamp_adjust)?
88278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
88288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
88298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
88308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(frm_int > 0 && codec_cond)
88318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
88328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
88338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            act_timestamp = prev_ts + frm_int;
88348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
88358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            prev_ts = act_timestamp;
88368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
88378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
88388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            set_frame_rate(act_timestamp);
88398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
88408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (frm_int > 0)           // In this case the frame rate was set along
88418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {                               // with the port definition, start ts with 0
88428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
88438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rst_prev_ts = true;
88448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
88458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
88468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
88478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
88488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
88498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
88508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 num_conceal_MB = 0;
88518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 frame_rate = 0;
88528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int consumed_len = 0;
88538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 num_MB_in_frame;
88548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 recovery_sei_flags = 1;
88558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int buf_index = p_buf_hdr - m_out_mem_ptr;
88568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
88578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
88588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        p_buf_hdr->nOffset;
88598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!drv_ctx.extradata_info.uaddr) {
88608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
88618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
88628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    p_extra = (OMX_OTHER_EXTRADATATYPE *)
8863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ((unsigned long)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
88648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!client_extradata)
88658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        p_extra = NULL;
88668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
88678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((OMX_U8*)p_extra >= (pBuffer + p_buf_hdr->nAllocLen))
88688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        p_extra = NULL;
88698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
88708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (data) {
88718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        while((consumed_len < drv_ctx.extradata_info.buffer_size)
88728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) {
88738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if ((consumed_len + data->nSize) > (OMX_U32)drv_ctx.extradata_info.buffer_size) {
88748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Invalid extra data size");
88758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    break;
88768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
8877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                unsigned char* tmp = data->data;
88788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                switch((unsigned long)data->eType) {
88798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavancase MSM_VIDC_EXTRADATA_INTERLACE_VIDEO:
88808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct msm_vidc_interlace_payload *payload;
8881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    payload = (struct msm_vidc_interlace_payload *)tmp;
88828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (payload->format != MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) {
88838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int enable = 1;
88848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_U32 mbaff = 0;
88858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
88868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ((payload->format == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
88878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
88888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
88898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
88908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_enable_android_native_buffers)
88918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
88928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            PP_PARAM_INTERLACED, (void*)&enable);
88938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
88948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) {
88958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        append_interlace_extradata(p_extra, payload->format);
88968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
88978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
88988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    break;
88998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavancase MSM_VIDC_EXTRADATA_FRAME_RATE:
89008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct msm_vidc_framerate_payload *frame_rate_payload;
8901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    frame_rate_payload = (struct msm_vidc_framerate_payload *)tmp;
89028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frame_rate = frame_rate_payload->frame_rate;
89038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    break;
89048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavancase MSM_VIDC_EXTRADATA_TIMESTAMP:
89058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct msm_vidc_ts_payload *time_stamp_payload;
8906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    time_stamp_payload = (struct msm_vidc_ts_payload *)tmp;
89078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo;
89088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
89098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    break;
89108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavancase MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB:
89118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct msm_vidc_concealmb_payload *conceal_mb_payload;
8912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    conceal_mb_payload = (struct msm_vidc_concealmb_payload *)tmp;
89138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
89148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (drv_ctx.video_resolution.frame_height + 15)) >> 8;
89158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
89168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    break;
89178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavancase MSM_VIDC_EXTRADATA_ASPECT_RATIO:
89188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
8919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)tmp;
89208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    ((struct vdec_output_frameinfo *)
89218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
89228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    ((struct vdec_output_frameinfo *)
89238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
89248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    break;
89258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavancase MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI:
89268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct msm_vidc_recoverysei_payload *recovery_sei_payload;
8927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)tmp;
89288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    recovery_sei_flags = recovery_sei_payload->flags;
89298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) {
89308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
89318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Extradata: OMX_BUFFERFLAG_DATACORRUPT Received");
89328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
89338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    break;
89348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavancase MSM_VIDC_EXTRADATA_PANSCAN_WINDOW:
8935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    panscan_payload = (struct msm_vidc_panscan_window_payload *)tmp;
89368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    break;
89378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavandefault:
89388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    goto unrecognized_extradata;
89398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
89408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                consumed_len += data->nSize;
89418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
89428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
89438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
89448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
89458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            append_frame_info_extradata(p_extra,
89468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
89478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                panscan_payload,&((struct vdec_output_frameinfo *)
89488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);}
89498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
89508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanunrecognized_extradata:
89518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!secure_mode && client_extradata)
89528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        append_terminator_extradata(p_extra);
89538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return;
89548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
89558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
89568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
89578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                         bool is_internal, bool enable)
89588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
89598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
89608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_control control;
89618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state != OMX_StateLoaded)
89628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
89638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
89648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
89658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
89668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("NOTE: enable_extradata: actual[%lx] requested[%lx] enable[%d], is_internal: %d swvdec mode %d",
89678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        client_extradata, requested_extradata, enable, is_internal, m_swvdec_mode);
89688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
89698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!is_internal) {
89708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (enable)
89718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            client_extradata |= requested_extradata;
89728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
89738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            client_extradata = client_extradata & ~requested_extradata;
89748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
89758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
89768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (enable) {
89778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_pSwVdec == NULL || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY) {
89788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
89798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
89808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
89818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
89828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
89838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        " Quality of interlaced clips might be impacted.");
89848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
89858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA)
89868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
89878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
89888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
89898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
89908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Failed to set framerate extradata");
89918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
89928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
89938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
89948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
89958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Failed to set concealed MB extradata");
89968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
89978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
89988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
89998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
90008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata");
90018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
90028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
90038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
90048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
90058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Failed to set panscan extradata");
90068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
90078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
90088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO;
90098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
90108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Failed to set panscan extradata");
90118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
90128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA){
90138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
90148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
90158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if(ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
90168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Failed to set timeinfo extradata");
90178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
90188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
90198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
90208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
90218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return ret;
90228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
90238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
90248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
90258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
90268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
90278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U8 *data_ptr = extra->data, data = 0;
90288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while (byte_count < extra->nDataSize)
90298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
90308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        data = *data_ptr;
90318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        while (data)
90328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
90338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            num_MB += (data&0x01);
90348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            data >>= 1;
90358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
90368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        data_ptr++;
90378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        byte_count++;
90388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
90398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
90408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (drv_ctx.video_resolution.frame_height + 15)) >> 8;
90418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
90428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
90438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
90448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
90458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
90468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!m_debug_extradata)
90478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
90488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
9049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned char* tmp = extra->data;
9050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
90518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH(
90528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        "============== Extra Data ==============\n"
90538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        "           Size: %lu\n"
90548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        "        Version: %lu\n"
90558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        "      PortIndex: %lu\n"
90568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        "           Type: %x\n"
90578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        "       DataSize: %lu",
90588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        extra->nSize, extra->nVersion.nVersion,
90598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        extra->nPortIndex, extra->eType, extra->nDataSize);
90608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
90618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat)
90628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
9063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)tmp;
90648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH(
90658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "------ Interlace Format ------\n"
90668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "                Size: %lu\n"
90678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "             Version: %lu\n"
90688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "           PortIndex: %lu\n"
90698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            " Is Interlace Format: %d\n"
90708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "   Interlace Formats: %lu\n"
90718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "=========== End of Interlace ===========",
90728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
90738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
90748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
90758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo)
90768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
9077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)tmp;
90788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
90798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH(
90808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "-------- Frame Format --------\n"
90818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "             Picture Type: %d\n"
90828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "           Interlace Type: %d\n"
90838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            " Pan Scan Total Frame Num: %lu\n"
90848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "   Concealed Macro Blocks: %lu\n"
90858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "               frame rate: %lu\n"
90868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "           Aspect Ratio X: %lu\n"
90878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "           Aspect Ratio Y: %lu",
90888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fminfo->ePicType,
90898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fminfo->interlaceType,
90908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fminfo->panScan.numWindows,
90918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fminfo->nConcealedMacroblocks,
90928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fminfo->nFrameRate,
90938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fminfo->aspectRatio.aspectRatioX,
90948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fminfo->aspectRatio.aspectRatioY);
90958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
90968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++)
90978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
90988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH(
90998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "------------------------------\n"
91008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "     Pan Scan Frame Num: %lu\n"
91018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "            Rectangle x: %ld\n"
91028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "            Rectangle y: %ld\n"
91038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "           Rectangle dx: %ld\n"
91048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "           Rectangle dy: %ld",
91058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
91068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
91078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
91088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
91098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
91108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
91118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (extra->eType == OMX_ExtraDataNone)
91128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
91138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("========== End of Terminator ===========");
91148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
91158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
91168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
91178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
91188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
91198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
91208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
91218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
91228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          OMX_U32 interlaced_format_type)
91238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
91248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_STREAMINTERLACEFORMAT *interlace_format;
91258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 mbaff = 0;
91268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!(client_extradata & OMX_INTERLACE_EXTRADATA) || !extra) {
91278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
91288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
91298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
91308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
91318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
91328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
91338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
9134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned char* tmp = extra->data;
9135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    interlace_format = (OMX_STREAMINTERLACEFORMAT *)tmp;
91368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
91378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
91388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
91398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
91408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
91418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
91428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        interlace_format->bInterlaceFormat = OMX_FALSE;
91438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
91448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
91458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
91468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
91478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
91488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        interlace_format->bInterlaceFormat = OMX_TRUE;
91498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
91508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
91518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
91528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    print_debug_extradata(extra);
91538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
91548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
91558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::fill_aspect_ratio_info(
91568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstruct vdec_aspectratioinfo *aspect_ratio_info,
91578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
91588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
91598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_extradata = frame_info;
91608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
91618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
91628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("aspectRatioX %lu aspectRatioX %lu", m_extradata->aspectRatio.aspectRatioX,
91638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_extradata->aspectRatio.aspectRatioY);
91648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
91658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
91668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
91678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
91688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstruct msm_vidc_panscan_window_payload *panscan_payload,
91698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstruct vdec_aspectratioinfo *aspect_ratio_info)
91708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
91718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
91728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct msm_vidc_panscan_window *panscan_window;
91738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA) || !extra) {
91748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
91758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
91768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
91778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
91788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
91798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
91808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
9181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned char* tmp = extra->data;
9182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)tmp;
91838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    switch (picture_type)
91848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
91858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case PICTURE_TYPE_I:
91868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frame_info->ePicType = OMX_VIDEO_PictureTypeI;
91878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
91888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case PICTURE_TYPE_P:
91898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frame_info->ePicType = OMX_VIDEO_PictureTypeP;
91908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
91918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case PICTURE_TYPE_B:
91928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frame_info->ePicType = OMX_VIDEO_PictureTypeB;
91938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
91948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    default:
91958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
91968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
91978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
91988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
91998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
92008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
92018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
92028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
92038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
92048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frame_info->nConcealedMacroblocks = num_conceal_mb;
92058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frame_info->nFrameRate = frame_rate;
92068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frame_info->panScan.numWindows = 0;
92078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(panscan_payload) {
92088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
92098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        panscan_window = &panscan_payload->wnd[0];
92108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++)
92118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
92128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
92138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
92148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
92158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
92168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            panscan_window++;
92178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
92188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
92198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    fill_aspect_ratio_info(aspect_ratio_info, frame_info);
92208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    print_debug_extradata(extra);
92218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
92228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
92248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
92258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!client_extradata || !extra) {
92268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
92278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
92288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
92308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
92318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
92328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
92338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
92348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
9235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned char* tmp = extra->data;
9236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)tmp;
92378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    *portDefn = m_port_def;
92388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("append_portdef_extradata height = %lu width = %lu stride = %lu"
92398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        "sliceheight = %lu",portDefn->format.video.nFrameHeight,
92408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->format.video.nFrameWidth,
92418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->format.video.nStride,
92428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->format.video.nSliceHeight);
92438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
92448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
92468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
92478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!client_extradata || !extra) {
92488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
92498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
92508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
92518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
92528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->eType = OMX_ExtraDataNone;
92538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nDataSize = 0;
92548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->data[0] = 0;
92558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    print_debug_extradata(extra);
92578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
92588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
92608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
92618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
92628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (index >= drv_ctx.ip_buf.actualcount)
92638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
92648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found");
92658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInsufficientResources;
92668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
92678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_desc_buffer_ptr == NULL)
92688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
92698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_desc_buffer_ptr = (desc_buffer_hdr*) \
92708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc( (sizeof(desc_buffer_hdr)),
92718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ip_buf.actualcount);
92728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_desc_buffer_ptr == NULL)
92738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
92748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed ");
92758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
92768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
92778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
92788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
92808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_desc_buffer_ptr[index].buf_addr == NULL)
92818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
92828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("desc buffer Allocation failed ");
92838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInsufficientResources;
92848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
92858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
92878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
92888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
92908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
92918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Inserting address offset (%lu) at idx (%lu)", address_offset,m_demux_entries);
92928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_demux_entries < 8192)
92938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
92948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_demux_offsets[m_demux_entries++] = address_offset;
92958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
92968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return;
92978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
92988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
93008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
93018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
93028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
93038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 index = 0;
93048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
93058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_demux_entries = 0;
93068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
93078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while (index < bytes_to_parse)
93088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
93098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
93108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
93118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
93128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (buf[index+2] == 0x01)) )
93138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
93148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            //Found start code, insert address offset
93158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            insert_demux_addr_offset(index);
93168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (buf[index+2] == 0x01) // 3 byte start code
93178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                index += 3;
93188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else                      //4 byte start code
93198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                index += 4;
93208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
93218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
93228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            index++;
93238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
93248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Extracted (%lu) demux entry offsets",m_demux_entries);
93258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return;
93268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
93278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
93288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
93298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
93308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //fix this, handle 3 byte start code, vc1 terminator entry
93318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U8 *p_demux_data = NULL;
93328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 desc_data = 0;
93338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 start_addr = 0;
93348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 nal_size = 0;
93358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 suffix_byte = 0;
93368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 demux_index = 0;
93378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 buffer_index = 0;
93388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
93398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_desc_buffer_ptr == NULL)
93408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
93418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
93428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
93438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
93448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
93458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
93468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer_index > drv_ctx.ip_buf.actualcount)
93478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
93488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index);
93498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
93508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
93518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
93528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
93538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
93548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ( ((OMX_U8*)p_demux_data == NULL) ||
93558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE)
93568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
93578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
93588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
93598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
93608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
93618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
93628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for (; demux_index < m_demux_entries; demux_index++)
93638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
93648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            desc_data = 0;
93658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            start_addr = m_demux_offsets[demux_index];
93668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01)
93678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
93688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
93698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
93708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
93718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
93728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
93738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
93748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (demux_index < (m_demux_entries - 1))
93758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
93768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
93778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
93788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
93798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
93808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
93818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
9382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("Start_addr(%d), suffix_byte(0x%x),nal_size(%lu),demux_index(%lu)",
9383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                start_addr,
93848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)suffix_byte,
93858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                nal_size,
93868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                demux_index);
93878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            desc_data = (start_addr >> 3) << 1;
93888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            desc_data |= (start_addr & 7) << 21;
93898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            desc_data |= suffix_byte << 24;
93908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
93918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
93928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
93938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
93948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
93958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
93968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            p_demux_data += 16;
93978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
93988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (codec_type_parse == CODEC_TYPE_VC1)
93998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
94008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("VC1 terminator entry");
94018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            desc_data = 0;
94028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            desc_data = 0x82 << 24;
94038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
94048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memset(p_demux_data + 4, 0, sizeof(OMX_U32));
94058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
94068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
94078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            p_demux_data += 16;
94088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_demux_entries++;
94098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
94108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        //Add zero word to indicate end of descriptors
94118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memset(p_demux_data, 0, sizeof(OMX_U32));
94128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
94138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
94148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("desc table data size=%lu", m_desc_buffer_ptr[buffer_index].desc_data_size);
94158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
94168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
94178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_demux_entries = 0;
94188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Demux table complete!");
94198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
94208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
94218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
94228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
94238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
94248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    enabled = false;
94258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx = NULL;
94268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    init_members();
94278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    ColorFormat = OMX_COLOR_FormatMax;
94288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
94298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
94308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
94318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
94328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx = reinterpret_cast<omx_vdec*>(client);
94338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
94348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
94358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::allocate_color_convert_buf::init_members() {
94368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    allocated_count = 0;
94378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buffer_size_req = 0;
94388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buffer_alignment_req = 0;
94398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(m_platform_list_client,0,sizeof(m_platform_list_client));
94408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
94418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
94428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
94438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
94448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
94458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
94468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for (int i = 0; i < MAX_COUNT;i++)
94478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pmem_fd[i] = -1;
94488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
94498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
94508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf() {
94518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    c2d.destroy();
94528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
94538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
94548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::allocate_color_convert_buf::update_buffer_req()
94558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
94568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool status = true;
94578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned int src_size = 0, destination_size = 0;
94588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_COLOR_FORMATTYPE drv_color_format;
94598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!omx){
94608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid client in color convert");
94618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return false;
94628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
94638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!enabled){
94648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("No color conversion required");
94658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return status;
94668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
94678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
94688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
94698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ColorFormat != OMX_COLOR_FormatYUV420Planar) {
94708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion");
94718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            status = false;
94728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            goto fail_update_buf_req;
94738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
94748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    c2d.close();
94758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
94768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        omx->drv_ctx.video_resolution.frame_width,
94778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        NV12_128m,YCbCr420P);
94788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (status) {
94798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        status = c2d.get_buffer_size(C2D_INPUT,src_size);
94808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (status)
94818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
94828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
94838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (status) {
94848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
94858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            !destination_size) {
94868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d"
94878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    "driver size %d destination size %d",
94888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
94898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                status = false;
94908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                c2d.close();
94918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buffer_size_req = 0;
94928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else {
94938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer_size_req = destination_size;
94948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
94958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
94968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
94978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
94988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
94998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
95008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanfail_update_buf_req:
95018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
95028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return status;
95038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
95048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
95058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::allocate_color_convert_buf::set_color_format(
95068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_COLOR_FORMATTYPE dest_color_format)
95078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
95088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool status = true;
95098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_COLOR_FORMATTYPE drv_color_format;
95108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!omx){
95118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid client in color convert");
95128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return false;
95138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
95148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
95158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
95168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_color_format = (OMX_COLOR_FORMATTYPE)
95178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
95188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else {
95198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Incorrect color format");
95208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        status = false;
95218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
95228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (status && (drv_color_format != dest_color_format)) {
95238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Enabling C2D");
95248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
95258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Unsupported color format for c2d");
95268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            status = false;
95278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else {
95288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ColorFormat = OMX_COLOR_FormatYUV420Planar;
95298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (enabled)
95308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                c2d.destroy();
95318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            enabled = false;
95328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!c2d.init()) {
95338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("open failed for c2d");
95348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                status = false;
95358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else
95368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                enabled = true;
95378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
95388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else {
95398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (enabled)
95408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            c2d.destroy();
95418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        enabled = false;
95428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
95438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
95448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return status;
95458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
95468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
95478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
95488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
95498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!omx){
95508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
95518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return NULL;
95528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
95538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!enabled)
95548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return omx->m_out_mem_ptr;
95558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return m_out_mem_ptr_client;
95568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
95578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
95588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
95598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd)
95608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
95618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!omx){
95628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
95638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return NULL;
95648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
95658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!enabled)
95668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return bufadd;
95678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
95688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned index = 0;
95698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    index = bufadd - omx->m_out_mem_ptr;
95708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (index < omx->drv_ctx.op_buf.actualcount) {
95718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
95728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
95738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bool status;
95748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
95758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pthread_mutex_lock(&omx->c_lock);
95768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
95778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer,pmem_fd[index],
95788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pmem_baseaddress[index], pmem_baseaddress[index]);
95798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pthread_mutex_unlock(&omx->c_lock);
95808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
95818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!status){
95828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed color conversion %d", status);
95838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_out_mem_ptr_client[index].nFilledLen = 0;
95848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return &m_out_mem_ptr_client[index];
95858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
95868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else
95878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_out_mem_ptr_client[index].nFilledLen = 0;
95888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return &m_out_mem_ptr_client[index];
95898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
95908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr");
95918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return NULL;
95928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
95938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
95948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
95958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd)
95968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
95978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!omx){
95988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
95998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return NULL;
96008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
96018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!enabled)
96028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return bufadd;
96038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned index = 0;
96048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    index = bufadd - m_out_mem_ptr_client;
96058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (index < omx->drv_ctx.op_buf.actualcount) {
96068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return &omx->m_out_mem_ptr[index];
96078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
96088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr");
96098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return NULL;
96108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
96118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::allocate_color_convert_buf::get_buffer_req(unsigned int &buffer_size)
96128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
96138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool status = true;
96148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
96158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!enabled)
96168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer_size = omx->drv_ctx.op_buf.buffer_size;
96178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else {
96188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
96198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Get buffer size failed");
96208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            status = false;
96218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            goto fail_get_buffer_size;
96228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
96238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
96248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
96258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer_size = omx->drv_ctx.op_buf.buffer_size;
96268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
96278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
96288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanfail_get_buffer_size:
96298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
96308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return status;
96318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
96328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
96338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE *bufhdr)
96348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
96358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned int index = 0;
96368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
96378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!enabled)
96388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return omx->free_output_buffer(bufhdr);
96398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (enabled && omx->is_component_secure())
96408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorNone;
96418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!allocated_count || !bufhdr) {
96428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr);
96438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
96448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
96458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    index = bufhdr - m_out_mem_ptr_client;
96468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (index >= omx->drv_ctx.op_buf.actualcount){
96478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer");
96488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
96498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
96508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (pmem_fd[index] > 0) {
96518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        munmap(pmem_baseaddress[index], buffer_size_req);
96528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        close(pmem_fd[index]);
96538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
96548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pmem_fd[index] = -1;
96558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
96568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx->free_ion_memory(&op_buf_ion_info[index]);
96578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
96588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_heap_ptr[index].video_heap_ptr = NULL;
96598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (allocated_count > 0)
96608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        allocated_count--;
96618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
96628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        allocated_count = 0;
96638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!allocated_count) {
96648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_lock(&omx->c_lock);
96658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        c2d.close();
96668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        init_members();
96678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_unlock(&omx->c_lock);
96688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
96698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
96708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
96718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
96728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
96738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                                                   OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
96748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
96758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
96768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!enabled){
96778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
96788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return eRet;
96798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
96808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (enabled && omx->is_component_secure()) {
96818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d",
96828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            omx->is_component_secure());
96838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorUnsupportedSetting;
96848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
96858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!bufferHdr || bytes > buffer_size_req) {
96868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr);
96878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("color_convert buffer_size_req %d bytes %lu",
96888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer_size_req,bytes);
96898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
96908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
96918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
96928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert");
96938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInsufficientResources;
96948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
96958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
96968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
96978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        port,appData,omx->drv_ctx.op_buf.buffer_size);
96988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (eRet != OMX_ErrorNone || !temp_bufferHdr){
96998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Buffer allocation failed color_convert");
97008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return eRet;
97018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
97028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
97038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (int)omx->drv_ctx.op_buf.actualcount) {
97048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Invalid header index %d",
97058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (temp_bufferHdr - omx->m_out_mem_ptr));
97068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorUndefined;
97078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
97088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned int i = allocated_count;
97098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef USE_ION
97108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
97118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer_size_req,buffer_alignment_req,
97128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
97138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        0);
97148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
97158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (op_buf_ion_info[i].ion_device_fd < 0) {
97168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert");
97178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInsufficientResources;
97188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
97198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
97208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
97218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
97228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (pmem_baseaddress[i] == MAP_FAILED) {
97238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req);
97248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        close(pmem_fd[i]);
97258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        omx->free_ion_memory(&op_buf_ion_info[i]);
97268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInsufficientResources;
97278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
97288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_heap_ptr[i].video_heap_ptr = new VideoHeap (
97298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        op_buf_ion_info[i].ion_device_fd,buffer_size_req,
97308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
97318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
9732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_pmem_info_client[i].pmem_fd = (unsigned long)m_heap_ptr[i].video_heap_ptr.get();
97338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_pmem_info_client[i].offset = 0;
97348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
97358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
97368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_platform_list_client[i].nEntries = 1;
97378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
97388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
97398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
97408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_mem_ptr_client[i].nFilledLen = 0;
97418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_mem_ptr_client[i].nFlags = 0;
97428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
97438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
97448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
97458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
97468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
97478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_out_mem_ptr_client[i].pAppPrivate = appData;
97488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    *bufferHdr = &m_out_mem_ptr_client[i];
97498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("IL client buffer header %p", *bufferHdr);
97508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    allocated_count++;
97518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
97528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
97538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
97548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::is_component_secure()
97558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
97568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return secure_mode;
97578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
97588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
97598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
97608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
97618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool status = true;
97628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!enabled) {
97638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
97648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            dest_color_format =  (OMX_COLOR_FORMATTYPE)
97658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
97668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
97678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            status = false;
97688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else {
97698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
97708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            status = false;
97718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else
97728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            dest_color_format = OMX_COLOR_FormatYUV420Planar;
97738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
97748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return status;
97758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
97768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
97778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::buf_ref_add(int index, OMX_U32 fd, OMX_U32 offset)
97788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
97798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int i = 0;
97808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool buf_present = false;
97818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
97828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
97838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (out_dynamic_list[index].dup_fd &&
97848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (out_dynamic_list[index].fd != fd) &&
97858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (out_dynamic_list[index].offset != offset))
97868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
97878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("buf_ref_add error: index %d taken by fd = %lu offset = %lu, new fd %lu offset %lu",
97888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            index, out_dynamic_list[index].fd, out_dynamic_list[index].offset, fd, offset);
97898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_unlock(&m_lock);
97908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
97918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
97928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
97938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (out_dynamic_list[index].dup_fd == 0)
97948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
97958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        out_dynamic_list[index].fd = fd;
97968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        out_dynamic_list[index].offset = offset;
97978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        out_dynamic_list[index].dup_fd = dup(fd);
97988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
97998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    out_dynamic_list[index].ref_count++;
98008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("buf_ref_add: [ADDED] fd = %lu ref_count = %lu",
98018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan          out_dynamic_list[index].fd, out_dynamic_list[index].ref_count);
98028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
98038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
98048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
98058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::buf_ref_remove(OMX_U32 fd, OMX_U32 offset)
98068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
98078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long i = 0;
98088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
98098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
98108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        //check the buffer fd, offset, uv addr with list contents
98118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        //If present decrement reference.
98128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ((out_dynamic_list[i].fd == fd) &&
98138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (out_dynamic_list[i].offset == offset)) {
98148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            out_dynamic_list[i].ref_count--;
98158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (out_dynamic_list[i].ref_count == 0) {
98168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                close(out_dynamic_list[i].dup_fd);
98178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("buf_ref_remove: [REMOVED] fd = %lu ref_count = %lu",
98188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                     out_dynamic_list[i].fd, out_dynamic_list[i].ref_count);
98198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                out_dynamic_list[i].dup_fd = 0;
98208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                out_dynamic_list[i].fd = 0;
98218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                out_dynamic_list[i].offset = 0;
98228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
98238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                munmap(drv_ctx.ptr_outputbuffer[i].bufferaddr,
98248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].mmaped_size);
98258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("unmapped dynamic buffer idx %lu pBuffer %p",
98268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    i, drv_ctx.ptr_outputbuffer[i].bufferaddr);
98278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
98288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = NULL;
98298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = 0;
98308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_outputbuffer[i].mmaped_size = 0;
98318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (m_pSwVdecOpBuffer)
98328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                {
98338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    m_pSwVdecOpBuffer[i].pBuffer = NULL;
98348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    m_pSwVdecOpBuffer[i].nSize = 0;
98358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
98368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
98378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
98388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
98398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
98408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (i  >= drv_ctx.op_buf.actualcount) {
98418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error - could not remove ref, no match with any entry in list");
98428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
98438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
98448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
98458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
98468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::get_buffer_req_swvdec()
98478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
98488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
98498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
98508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!m_pSwVdec)
98518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
98528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet=get_buffer_req(&drv_ctx.ip_buf);
98538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet=get_buffer_req(&drv_ctx.op_buf);
98548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return eRet;
98558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
98568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
98578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    SWVDEC_PROP property;
98588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE)
98598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
98608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        property.ePropId = SWVDEC_PROP_ID_IPBUFFREQ;
98618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        SWVDEC_STATUS sRet = SwVdec_GetProperty(m_pSwVdec, &property);
98628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (sRet != SWVDEC_S_SUCCESS)
98638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
98648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorUndefined;
98658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
98668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
98678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
98688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ip_buf.buffer_size = property.uProperty.sIpBuffReq.nSize;
98698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ip_buf.mincount = property.uProperty.sIpBuffReq.nMinCount;
98708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ip_buf.actualcount = property.uProperty.sIpBuffReq.nMinCount;
98718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("swvdec input buf size %d count %d",drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.actualcount);
98728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
98738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
98748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
9875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    /* buffer requirement for out*/
9876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ( (false == m_smoothstreaming_mode) ||
9877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         ((drv_ctx.video_resolution.frame_height > m_smoothstreaming_width) &&
9878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin          (drv_ctx.video_resolution.frame_width  > m_smoothstreaming_height))
9879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin       )
98808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
9881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        property.ePropId = SWVDEC_PROP_ID_OPBUFFREQ;
9882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_STATUS sRet = SwVdec_GetProperty(m_pSwVdec, &property);
9883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (sRet != SWVDEC_S_SUCCESS)
98848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
9885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            return OMX_ErrorUndefined;
98868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
9887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
98888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
9889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            int client_extra_data_size = 0;
9890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
9891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
9892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_HIGH("Frame info extra data enabled!");
9893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
9894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
9895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (client_extradata & OMX_INTERLACE_EXTRADATA)
9896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
9897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_HIGH("OMX_INTERLACE_EXTRADATA!");
9898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
9899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
9900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (client_extradata & OMX_PORTDEF_EXTRADATA)
9901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
9902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
9903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d",
9904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    client_extra_data_size);
9905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
9906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (client_extra_data_size)
9907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
9908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
9909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
9910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.op_buf.buffer_size = property.uProperty.sOpBuffReq.nSize + client_extra_data_size;
9911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.op_buf.mincount = property.uProperty.sOpBuffReq.nMinCount;
9912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.op_buf.actualcount = property.uProperty.sOpBuffReq.nMinCount;
9913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_HIGH("swvdec opbuf size %lu extradata size %d total size %d count %d",
9914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                property.uProperty.sOpBuffReq.nSize, client_extra_data_size,
9915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.actualcount);
99168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
99178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
99188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
99208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
99218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return get_buffer_req(&drv_ctx.interm_op_buf);
99228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
99238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
99248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
99258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::set_buffer_req_swvdec(vdec_allocatorproperty *buffer_prop)
99278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
99288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
99298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!m_pSwVdec)
99318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
99328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = set_buffer_req(buffer_prop);
99338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return eRet;
99348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
99358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned buf_size = 0;
99378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    SWVDEC_PROP property;
99388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    SWVDEC_STATUS sRet = SWVDEC_S_SUCCESS;
99398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("set_buffer_req_swvdec IN: ActCnt(%d) Size(%d), buffer type %d",
99418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
99428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
99448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buf_size != buffer_prop->buffer_size)
99458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
99468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
99478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer_prop->buffer_size, buf_size);
99488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = OMX_ErrorBadParameter;
99498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
99508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
99518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
99528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        property.uProperty.sIpBuffReq.nSize = buffer_prop->buffer_size;
99538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        property.uProperty.sIpBuffReq.nMaxCount = buffer_prop->actualcount;
99548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        property.uProperty.sIpBuffReq.nMinCount = buffer_prop->actualcount;
99558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT)
99578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
99588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            property.ePropId = SWVDEC_PROP_ID_IPBUFFREQ;
99598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("swvdec input Buffer Size = %lu Count = %d",property.uProperty.sIpBuffReq.nSize, buffer_prop->mincount);
99608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
99618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT)
99628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
99638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            property.ePropId = SWVDEC_PROP_ID_OPBUFFREQ;
99648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("swvdec output Buffer Size = %lu and Count = %d",property.uProperty.sOpBuffReq.nSize, buffer_prop->actualcount);
99658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
99668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
99678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
99688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorBadParameter;
99698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
99708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(eRet==OMX_ErrorNone)
99728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
99738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            sRet = SwVdec_SetProperty(m_pSwVdec, &property);
99748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
99758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (sRet != SWVDEC_S_SUCCESS)
99778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
99788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Set buffer requirements from ARM codec failed");
99798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
99808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
99818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
99828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY) &&
99848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT))
99858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
99868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // need to update extradata buffers also
99878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.extradata_info.size = buffer_prop->actualcount * drv_ctx.extradata_info.buffer_size;
99888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.extradata_info.count = buffer_prop->actualcount;
99898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = set_buffer_req(&drv_ctx.interm_op_buf);
99908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
99918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
99938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
99948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
99968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
99978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::empty_this_buffer_proxy
99988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
99998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
100008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanThis routine is used to push the encoded video frames to
100018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanthe video decoder.
100028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
100048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
100058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
100078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX Error None if everything went successful.
100088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
100108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy_swvdec(OMX_IN OMX_HANDLETYPE hComp,
100118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
100128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
10013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)hComp;
100148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int push_cnt = 0,i=0;
100158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned nPortIndex = 0;
100168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
100178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_input_frameinfo frameinfo;
100188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_bufferpayload *temp_buffer;
100198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_seqheader seq_header;
100208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool port_setting_changed = true;
100218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool not_coded_vop = false;
100228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /*Should we generate a Aync error event*/
100248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer == NULL)
100258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
100268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid");
100278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
100288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
100298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_interm_mem_ptr);
100318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (nPortIndex > drv_ctx.interm_op_buf.actualcount)
100338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
100348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy_swvdec invalid nPortIndex[%u]",
100358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nPortIndex);
100368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
100378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
100388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /* return zero length and not an EOS buffer */
100408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ( (buffer->nFilledLen == 0) &&
100418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
100428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
100438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("return zero legth buffer");
100448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_lock(&m_lock);
100458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_interm_buf_state[nPortIndex] = WITH_SWVDEC;
100468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_unlock(&m_lock);
10047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        post_event ((unsigned long)buffer,(unsigned long)VDEC_S_SUCCESS,
10048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)OMX_COMPONENT_GENERATE_EBD_SWVDEC);
100498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorNone;
100508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
100518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_interm_bEnabled != OMX_TRUE || m_interm_flush_swvdec_progress == true)
100538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
100548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("empty_this_buffer_proxy_swvdec called when swvdec flush is in progress");
100558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorNone;
100568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
100578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    // send this buffer to swvdec
100598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("empty_this_buffer_proxy_swvdec bufHdr %p pBuffer %p nFilledLen %lu m_pSwVdecIpBuffer %p, idx %d nFlags %x",
100608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer, buffer->pBuffer, buffer->nFilledLen, m_pSwVdecIpBuffer, nPortIndex, (unsigned int)buffer->nFlags);
100618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_pSwVdecIpBuffer[nPortIndex].nFlags = buffer->nFlags;
100628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_pSwVdecIpBuffer[nPortIndex].nFilledLen = buffer->nFilledLen;
100638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_pSwVdecIpBuffer[nPortIndex].nIpTimestamp = buffer->nTimeStamp;
100648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (SwVdec_EmptyThisBuffer(m_pSwVdec, &m_pSwVdecIpBuffer[nPortIndex]) != SWVDEC_S_SUCCESS) {
100658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = OMX_ErrorBadParameter;
100668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
100678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
100688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_buf_state[nPortIndex] = WITH_SWVDEC;
100698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
100708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return ret;
100718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
100728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::empty_buffer_done_swvdec(OMX_HANDLETYPE hComp,
100748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                 OMX_BUFFERHEADERTYPE* buffer)
100758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
10076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)hComp;
100778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int idx = buffer - m_interm_mem_ptr;
100788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer == NULL || idx > (int)drv_ctx.interm_op_buf.actualcount)
100798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
100808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("empty_buffer_done_swvdec: ERROR bufhdr = %p", buffer);
100818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
100828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
100838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("empty_buffer_done_swvdec: bufhdr = %p, bufhdr->pBuffer = %p idx %d",
100858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer, buffer->pBuffer, idx);
100868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buffer->nFilledLen = 0;
100888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
100898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_interm_buf_state[idx] != WITH_SWVDEC)
100908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
100918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("empty_buffer_done_swvdec error: bufhdr = %p, idx %d, buffer not with swvdec ",buffer, idx);
100928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_unlock(&m_lock);
100938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
100948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
100958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_buf_state[idx] = WITH_COMPONENT;
100968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
100978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_interm_bEnabled != OMX_TRUE ||
100998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       output_flush_progress == true ||
101008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       m_interm_flush_dsp_progress == true ||
101018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       m_interm_flush_swvdec_progress == true)
101028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
101038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("empty_buffer_done_swvdec: Buffer (%p) flushed idx %d", buffer, idx);
101048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFilledLen = 0;
101058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nTimeStamp = 0;
101068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
101078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
101088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
101098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorNone;
101108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
101118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    // call DSP FTB for the intermediate buffer. post event to the command queue do it asynchrounously
101138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY && in_reconfig != true)
101148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
10115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        post_event((unsigned long)&m_cmp, (unsigned long)buffer, (unsigned long)OMX_COMPONENT_GENERATE_FTB_DSP);
101168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
101178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (m_swvdec_mode == SWVDEC_MODE_PARSE_DECODE)
101188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
10119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        post_event((unsigned long)&m_cmp, (unsigned long)buffer, (unsigned long)OMX_COMPONENT_GENERATE_EBD);
101208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
101218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
101238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
101248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::fill_all_buffers_proxy_dsp(OMX_HANDLETYPE hComp)
101268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
101278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int idx = 0;
101288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE nRet = OMX_ErrorNone;
101298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_fill_internal_bufers == OMX_FALSE)
101308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
101318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return nRet;
101328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
101338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_interm_mem_ptr == NULL)
101358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
101368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("fill_all_buffers_proxy_dsp called in bad state");
101378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return nRet;
101388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
101398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_fill_internal_bufers = OMX_FALSE;
101408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for (idx=0; idx < (int)drv_ctx.interm_op_buf.actualcount; idx++)
101428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
101438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_lock(&m_lock);
101448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_interm_buf_state[idx] == WITH_COMPONENT)
101458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
101468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_BUFFERHEADERTYPE* bufHdr = m_interm_mem_ptr + idx;
101478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nRet = fill_this_buffer_proxy_dsp(hComp, bufHdr);
101488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (nRet != OMX_ErrorNone)
101498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
101508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("fill_this_buffer_proxy_dsp failed for buff %d bufHdr %p pBuffer %p",
101518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    idx, bufHdr, bufHdr->pBuffer);
101528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
101538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
101548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
101558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_unlock(&m_lock);
101568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
101578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return nRet;
101588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
101598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan/* ======================================================================
101628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanFUNCTION
101638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::fill_this_buffer_proxy_dsp
101648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanDESCRIPTION
101668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanIL client uses this method to release the frame buffer
101678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanafter displaying them.
101688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanPARAMETERS
101708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanNone.
101718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanRETURN VALUE
101738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavantrue/false
101748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan========================================================================== */
101768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy_dsp(
101778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_HANDLETYPE hComp,
101788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
101798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
10180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)hComp;
101818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE nRet = OMX_ErrorNone;
101828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
101838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned nPortIndex = 0;
101848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_fillbuffer_cmd fillbuffer;
101858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
101868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
101878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int rc = 0;
101888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_state == OMX_StateInvalid)
101908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
101918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("FTB in Invalid State");
101928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorInvalidState;
101938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
101948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
101958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_interm_mem_ptr);
101968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (bufferAdd == NULL || nPortIndex > drv_ctx.interm_op_buf.actualcount) {
10198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("FTBProxyDSP: bufhdr = %p, nPortIndex %u bufCount %u",
10199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            bufferAdd, nPortIndex, drv_ctx.interm_op_buf.actualcount);
102008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
10201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
102028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("fill_this_buffer_proxy_dsp: bufhdr = %p,pBuffer = %p, idx %d, state %d",
102048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufferAdd, bufferAdd->pBuffer, nPortIndex, m_interm_buf_state[nPortIndex]);
102058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
102078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_interm_buf_state[nPortIndex] == WITH_DSP)
102088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
102098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("fill_this_buffer_proxy_dsp: buffer is with dsp");
102108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_unlock(&m_lock);
102118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorNone;
102128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
102138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
102148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
102168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (ptr_respbuffer)
102178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
102188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ptr_outputbuffer = (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
102198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
102208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL)
102228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
102238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
102248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFilledLen = 0;
102258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
102268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
102278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_interm_bEnabled != OMX_TRUE || m_interm_flush_dsp_progress == true)
102298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
102308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("fill_this_buffer_proxy_dsp called when dsp flush in progress");
102318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFilledLen = 0;
102328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorNone;
102338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
102348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memcpy (&fillbuffer.buffer,ptr_outputbuffer,
102368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sizeof(struct vdec_bufferpayload));
102378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    fillbuffer.client_data = bufferAdd;
102388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_buffer buf;
102408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
102418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset( (void *)&buf, 0, sizeof(buf));
102428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
102438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int extra_idx = 0;
102448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buf.index = nPortIndex;
102468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
102478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
102488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    plane[0].bytesused = buffer->nFilledLen;
102498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    plane[0].length = drv_ctx.interm_op_buf.buffer_size;
102508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    plane[0].m.userptr =
102518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (unsigned long)drv_ctx.ptr_interm_outputbuffer[nPortIndex].bufferaddr -
102528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (unsigned long)drv_ctx.ptr_interm_outputbuffer[nPortIndex].offset;
102538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    plane[0].reserved[0] = drv_ctx.ptr_interm_outputbuffer[nPortIndex].pmem_fd;
102558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    plane[0].reserved[1] = drv_ctx.ptr_interm_outputbuffer[nPortIndex].offset;
102568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    plane[0].data_offset = 0;
102578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
102598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
102608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[extra_idx].bytesused = 0;
102618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
102628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
102638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
102648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
102658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[extra_idx].data_offset = 0;
102668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extra_idx >= VIDEO_MAX_PLANES) {
102678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extradata index higher than expected: %d", extra_idx);
102688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
102698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
102708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buf.m.planes = plane;
102728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buf.length = drv_ctx.num_planes;
102738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
102748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (rc) {
102758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf to driver");
102768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
102778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
102788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
102808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_buf_state[nPortIndex] = WITH_DSP;
102818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
102828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
102848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
102858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::fill_buffer_done_dsp(OMX_HANDLETYPE hComp,
102878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                             OMX_BUFFERHEADERTYPE * buffer)
102888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
10289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)hComp;
102908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int idx = buffer - m_interm_mem_ptr;
102918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!buffer || idx >= (int)drv_ctx.interm_op_buf.actualcount)
102928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
102938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p), m_interm_mem_ptr(%p) idx %d", buffer, m_interm_mem_ptr, idx);
102948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
102958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
102968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
102978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("fill_buffer_done_dsp: bufhdr = %p, bufhdr->pBuffer = %p, idx %d nFilledLen %lu nFlags %x",
102988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer, buffer->pBuffer, idx, buffer->nFilledLen, (unsigned int)buffer->nFlags);
102998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
103008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
103018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_interm_buf_state[idx] != WITH_DSP)
103028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
103038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("fill_buffer_done_dsp error: bufhdr = %p, idx %d, buffer not with dsp", buffer, idx);
103048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pthread_mutex_unlock(&m_lock);
103058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
103068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
103078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_buf_state[idx] = WITH_COMPONENT;
103088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
103098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
103108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_interm_bEnabled != OMX_TRUE ||
103118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       output_flush_progress == true ||
103128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       m_interm_flush_dsp_progress == true ||
103138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       m_interm_flush_swvdec_progress == true)
103148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
103158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("fill_buffer_done_dsp: Buffer (%p) flushed idx %d", buffer, idx);
103168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFilledLen = 0;
103178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nTimeStamp = 0;
103188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
103198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
103208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
103218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorNone;
103228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
103238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
103248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
103258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
103268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("interm EOS has been reached");
103278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
103288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (psource_frame)
103298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
103308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
103318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            psource_frame = NULL;
103328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
103338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pdest_frame)
103348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
103358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pdest_frame->nFilledLen = 0;
10336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_input_free_q.insert_entry((unsigned long) pdest_frame,(unsigned long)NULL,
10337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (unsigned long)NULL);
103388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pdest_frame = NULL;
103398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
103408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
103418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
103428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.im_buffer_log)
103438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
103448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        log_im_buffer(buffer);
103458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
103468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    post_event((unsigned long)&m_cmp, (unsigned long)buffer, (unsigned long)OMX_COMPONENT_GENERATE_ETB_SWVDEC);
103488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
103498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
103508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
103518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::allocate_interm_buffer(OMX_U32 bytes)
103528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
103538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
103548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header
103558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned                         i= 0; // Temporary counter
103568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
103578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int extra_idx = 0;
10358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int heap_id = 0;
103598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
103608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int ion_device_fd =-1;
103618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct ion_allocation_data ion_alloc_data;
103628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct ion_fd_data fd_ion_data;
103638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _HEVC_USE_ADSP_HEAP_
10365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    heap_id = ION_ADSP_HEAP_ID;
10366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else
10367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    heap_id = ION_IOMMU_HEAP_ID;
10368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif
10369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
103708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(!m_interm_mem_ptr)
103718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
103728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate interm buffer Header: Cnt(%d) Sz(%d)",
103738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.interm_op_buf.actualcount,  drv_ctx.interm_op_buf.buffer_size);
103748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
103758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int nBufHdrSize = drv_ctx.interm_op_buf.actualcount * sizeof(OMX_BUFFERHEADERTYPE);
103768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_interm_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
103778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
103788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_interm_outputbuffer = (struct vdec_bufferpayload *)
103798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc (sizeof(struct vdec_bufferpayload), drv_ctx.interm_op_buf.actualcount);
103808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_interm_respbuffer = (struct vdec_output_frameinfo  *)
103818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc (sizeof (struct vdec_output_frameinfo), drv_ctx.interm_op_buf.actualcount);
103828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.interm_op_buf_ion_info = (struct vdec_ion *)
103838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            calloc (sizeof(struct vdec_ion), drv_ctx.interm_op_buf.actualcount);
103848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pSwVdecIpBuffer = (SWVDEC_IPBUFFER *)calloc(sizeof(SWVDEC_IPBUFFER), drv_ctx.interm_op_buf.actualcount);
103858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
103868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_interm_mem_ptr == NULL ||
103878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_interm_outputbuffer == NULL ||
103888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_interm_respbuffer == NULL ||
103898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.interm_op_buf_ion_info == NULL ||
103908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pSwVdecIpBuffer == NULL)
103918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
103928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            goto clean_up;
103938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
103948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
103958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
103968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bufHdr = m_interm_mem_ptr;
103978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for (unsigned long i = 0; i < drv_ctx.interm_op_buf.actualcount; i++)
103988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
103998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int pmem_fd = -1;
104008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned char *pmem_baseaddress = NULL;
104018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int flags = secure_mode ? ION_SECURE : 0;
104028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_pSwVdec)
104038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
104048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Allocate cached interm buffers");
104058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            flags = ION_FLAG_CACHED;
104068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
104078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("allocate interm output buffer size %d idx %lu",
104098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.interm_op_buf.buffer_size, i);
104108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ion_device_fd = alloc_map_ion_memory(
104118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.interm_op_buf.buffer_size,
104128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.interm_op_buf.alignment,
10413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            &ion_alloc_data, &fd_ion_data, flags, heap_id);
104148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ion_device_fd < 0) {
104158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
104168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            goto clean_up;
104178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
104188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pmem_fd = fd_ion_data.fd;
104198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_interm_outputbuffer[i].pmem_fd = pmem_fd;
104218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.interm_op_buf_ion_info[i].ion_device_fd = ion_device_fd;
104228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.interm_op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
104238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.interm_op_buf_ion_info[i].fd_ion_data = fd_ion_data;
104248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!secure_mode) {
104268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pmem_baseaddress = (unsigned char *)mmap(NULL,
104278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.interm_op_buf.buffer_size,
104288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                PROT_READ|PROT_WRITE,MAP_SHARED, pmem_fd, 0);
104298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (pmem_baseaddress == MAP_FAILED)
104308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
104318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("MMAP failed for Size %d",
104328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.interm_op_buf.buffer_size);
104338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
104348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                goto clean_up;
104358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
104368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
104378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
104398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
104408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr->nAllocLen          = bytes;
104418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr->nFilledLen         = 0;
104428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr->pAppPrivate        = this;
104438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
104448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr->pBuffer            = pmem_baseaddress;
104458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr->nOffset            = 0;
104468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr->pOutputPortPrivate = &drv_ctx.ptr_interm_respbuffer[i];
104488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_interm_respbuffer[i].client_data = (void *)&drv_ctx.ptr_interm_outputbuffer[i];
104498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_interm_outputbuffer[i].offset = 0;
104508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_interm_outputbuffer[i].bufferaddr = pmem_baseaddress;
104518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_interm_outputbuffer[i].mmaped_size = drv_ctx.interm_op_buf.buffer_size;
104528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_interm_outputbuffer[i].buffer_len = drv_ctx.interm_op_buf.buffer_size;
104538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("interm pmem_fd = %d offset = %d address = %p, bufHdr %p",
104558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pmem_fd, drv_ctx.ptr_interm_outputbuffer[i].offset,
104568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_interm_outputbuffer[i].bufferaddr, bufHdr);
104578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_interm_buf_state[i] = WITH_COMPONENT;
104598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pSwVdecIpBuffer[i].pBuffer = bufHdr->pBuffer;
104608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pSwVdecIpBuffer[i].pClientBufferData = (void*)i;
104618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // Move the buffer and buffer header pointers
104638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr++;
104648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
104658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    eRet = allocate_extradata();
104678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (eRet != OMX_ErrorNone)
104688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
104698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        goto clean_up;
104708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
104718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for(i=0; i<drv_ctx.interm_op_buf.actualcount; i++)
104738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
104748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        struct v4l2_buffer buf;
104758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        struct v4l2_plane plane[VIDEO_MAX_PLANES];
104768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int rc;
104778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr = (m_interm_mem_ptr + i );
104798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (secure_mode) {
104808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.ptr_interm_outputbuffer[i].bufferaddr = bufHdr;
104818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
104828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.index = i;
104848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
104858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
104868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[0].length = drv_ctx.interm_op_buf.buffer_size;
104878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[0].m.userptr = (unsigned long)drv_ctx.ptr_interm_outputbuffer[i].bufferaddr -
104888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned long)drv_ctx.ptr_interm_outputbuffer[i].offset;
104898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[0].reserved[0] = drv_ctx.interm_op_buf_ion_info[i].fd_ion_data.fd;
104908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[0].reserved[1] = drv_ctx.ptr_interm_outputbuffer[i].offset;
104918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        plane[0].data_offset = 0;
104928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
104938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
104948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
104958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr
104968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                + i * drv_ctx.extradata_info.buffer_size);
104978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
104988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
104998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            plane[extra_idx].data_offset = 0;
105008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if (extra_idx >= VIDEO_MAX_PLANES) {
105018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx);
105028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            goto clean_up;
105038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
105048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.m.planes = plane;
105058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.length = drv_ctx.num_planes;
10506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_LOW("Set interm Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_interm_outputbuffer[i].bufferaddr);
105078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
105088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (rc) {
105098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("VIDIOC_PREPARE_BUF failed");
105108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            goto clean_up;
105118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
105128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
105138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (i == (drv_ctx.interm_op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
105148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            enum v4l2_buf_type buf_type;
105158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
105168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
105178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (rc) {
105188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorInsufficientResources;
105198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
105208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                streaming[CAPTURE_PORT] = true;
105218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("STREAMON Successful");
105228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
105238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
105248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
105258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr->pAppPrivate = this;
105268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
105278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
105288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_bEnabled = OMX_TRUE;
105298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_bPopulated = OMX_TRUE;
105308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
105318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
105328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
105338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanclean_up:
105348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
105358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.interm_op_buf_ion_info)
105368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
105378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for(i=0; i< drv_ctx.interm_op_buf.actualcount; i++)
105388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
105398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(drv_ctx.ptr_interm_outputbuffer)
105408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
105418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                close(drv_ctx.ptr_interm_outputbuffer[i].pmem_fd);
105428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_interm_outputbuffer[i].pmem_fd = 0;
105438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
105448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            free_ion_memory(&drv_ctx.interm_op_buf_ion_info[i]);
105458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
105468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
105478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
105488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_interm_mem_ptr)
105498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
105508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(m_interm_mem_ptr);
105518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_interm_mem_ptr = NULL;
105528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
105538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(drv_ctx.ptr_interm_outputbuffer)
105548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
105558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(drv_ctx.ptr_interm_outputbuffer);
105568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_interm_outputbuffer = NULL;
105578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
105588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(drv_ctx.ptr_interm_respbuffer)
105598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
105608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(drv_ctx.ptr_interm_respbuffer);
105618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_interm_respbuffer = NULL;
105628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
105638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.interm_op_buf_ion_info) {
105648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free o/p ion context");
105658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(drv_ctx.interm_op_buf_ion_info);
105668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.interm_op_buf_ion_info = NULL;
105678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
105688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorInsufficientResources;
105698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
105708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
105718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan//callback function used by SWVdec
105728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
105738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanSWVDEC_STATUS omx_vdec::swvdec_input_buffer_done_cb
105748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan(
105758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan SWVDEC_HANDLE pSwDec,
105768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan SWVDEC_IPBUFFER *m_pSwVdecIpBuffer,
105778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan void *pClientHandle
105788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan )
105798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
10580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)pSwDec;
105818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    SWVDEC_STATUS eRet = SWVDEC_S_SUCCESS;
105828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx_vdec *omx = reinterpret_cast<omx_vdec*>(pClientHandle);
105838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
105848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_pSwVdecIpBuffer == NULL)
105858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
105868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = SWVDEC_S_EFAIL;
105878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
105888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
105898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
105908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("%s invoked", __func__);
105918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        omx->swvdec_input_buffer_done(m_pSwVdecIpBuffer);
105928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
105938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
105948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
105958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
105968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
105978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::swvdec_input_buffer_done(SWVDEC_IPBUFFER *m_pSwVdecIpBuffer)
105988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
10599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long index = (unsigned long)m_pSwVdecIpBuffer->pClientBufferData;
106008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
106018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
106028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
10603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        post_event((unsigned long)(m_interm_mem_ptr + index),
10604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)VDEC_S_SUCCESS, (unsigned long)OMX_COMPONENT_GENERATE_EBD_SWVDEC);
106058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
106068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
106078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
10608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        post_event((unsigned long)(m_inp_mem_ptr + index),
10609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (unsigned long)VDEC_S_SUCCESS, (unsigned long)OMX_COMPONENT_GENERATE_EBD);
106108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
106118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
106128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
106138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanSWVDEC_STATUS omx_vdec::swvdec_fill_buffer_done_cb
106148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan(
106158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan SWVDEC_HANDLE pSwDec,
106168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan SWVDEC_OPBUFFER *m_pSwVdecOpBuffer,
106178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan void *pClientHandle
106188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan)
106198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
10620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)pSwDec;
106218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    SWVDEC_STATUS eRet = SWVDEC_S_SUCCESS;
106228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx_vdec *omx = reinterpret_cast<omx_vdec*>(pClientHandle);
106238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
106248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_pSwVdecOpBuffer == NULL)
106258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
106268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eRet = SWVDEC_S_EFAIL;
106278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
106288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
106298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
106308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        omx->swvdec_fill_buffer_done(m_pSwVdecOpBuffer);
106318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
106328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
106338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
106348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
106358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::swvdec_fill_buffer_done(SWVDEC_OPBUFFER *m_pSwVdecOpBuffer)
106368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
10637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long index = (unsigned long)m_pSwVdecOpBuffer->pClientBufferData;
106388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BUFFERHEADERTYPE *bufHdr = m_out_mem_ptr + index;
106398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bufHdr->nFilledLen = m_pSwVdecOpBuffer->nFilledLen;
106408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bufHdr->nFlags = m_pSwVdecOpBuffer->nFlags;
106418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bufHdr->nTimeStamp = m_pSwVdecOpBuffer->nOpTimestamp;
106428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_pSwVdecOpBuffer->nFilledLen != 0)
10644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
10645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((m_pSwVdecOpBuffer->nHeight != rectangle.nHeight) ||
10646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (m_pSwVdecOpBuffer->nWidth != rectangle.nWidth))
10647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
10648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.video_resolution.frame_height = m_pSwVdecOpBuffer->nHeight;
10649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.video_resolution.frame_width = m_pSwVdecOpBuffer->nWidth;
10650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
10651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            rectangle.nLeft = 0;
10652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            rectangle.nTop = 0;
10653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            rectangle.nWidth = m_pSwVdecOpBuffer->nWidth;
10654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            rectangle.nHeight = m_pSwVdecOpBuffer->nHeight;
10655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
10656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_HIGH("swvdec_fill_buffer_done rectangle.WxH: %lu %lu",
10657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                rectangle.nWidth, rectangle.nHeight);
10658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
10659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop,
10660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                   OMX_COMPONENT_GENERATE_PORT_RECONFIG);
10661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
10662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
10663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
106648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (dynamic_buf_mode && m_pSwVdecOpBuffer->nFilledLen)
106658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
106668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr->nFilledLen = bufHdr->nAllocLen;
106678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
106688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (bufHdr->nFlags & OMX_BUFFERFLAG_EOS)
106698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
106708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("swvdec output EOS reached");
106718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
10672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    DEBUG_PRINT_LOW("swvdec_fill_buffer_done bufHdr %p pBuffer %p SwvdecOpBuffer %p idx %lu nFilledLen %lu nAllocLen %lu nFlags %lx",
106738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bufHdr, bufHdr->pBuffer, m_pSwVdecOpBuffer->pBuffer, index, m_pSwVdecOpBuffer->nFilledLen, bufHdr->nAllocLen, m_pSwVdecOpBuffer->nFlags);
10674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    post_event((unsigned long)bufHdr, (unsigned long)VDEC_S_SUCCESS, (unsigned long)OMX_COMPONENT_GENERATE_FBD);
106758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
106768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
106778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanSWVDEC_STATUS omx_vdec::swvdec_handle_event_cb
106788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan(
106798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    SWVDEC_HANDLE pSwDec,
106808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    SWVDEC_EVENTHANDLER* pEventHandler,
106818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    void *pClientHandle
106828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan)
106838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
10684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void)pSwDec;
106858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx_vdec *omx = reinterpret_cast<omx_vdec*>(pClientHandle);
106868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    omx->swvdec_handle_event(pEventHandler);
106878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return SWVDEC_S_SUCCESS;
106888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
106898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
106908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::swvdec_handle_event(SWVDEC_EVENTHANDLER *pEvent)
106918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
106928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    switch(pEvent->eEvent)
106938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
106948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case SWVDEC_FLUSH_DONE:
106958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("SWVDEC_FLUSH_DONE input_flush_progress %d output_flush_progress %d",
106968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            input_flush_progress, output_flush_progress);
106978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (input_flush_progress)
106988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
10699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            post_event ((unsigned long)NULL, (unsigned long)VDEC_S_SUCCESS, (unsigned long)OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
107008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
107018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (output_flush_progress)
107028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
10703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            post_event ((unsigned long)NULL, (unsigned long)VDEC_S_SUCCESS, (unsigned long)OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
107048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
107058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
107068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
107078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case SWVDEC_RECONFIG_SUFFICIENT_RESOURCES:
107088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
107098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("swvdec port settings changed info");
10710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (false == m_smoothstreaming_mode)
10711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
10712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                // get_buffer_req and populate port defn structure
10713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                SWVDEC_PROP prop;
10714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                prop.ePropId = SWVDEC_PROP_ID_DIMENSIONS;
10715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                SwVdec_GetProperty(m_pSwVdec, &prop);
107168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                update_resolution(prop.uProperty.sDimensions.nWidth,
10718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    prop.uProperty.sDimensions.nHeight,
10719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    prop.uProperty.sDimensions.nWidth,
10720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    prop.uProperty.sDimensions.nHeight);
10721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                drv_ctx.video_resolution.stride = (prop.uProperty.sDimensions.nWidth + 127) & (~127);
10722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                drv_ctx.video_resolution.scan_lines = (prop.uProperty.sDimensions.nHeight + 31) & (~31);
10723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
10724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_port_def.nPortIndex = 1;
10725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                update_portdef(&m_port_def);
10726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                post_event ((unsigned)NULL, VDEC_S_SUCCESS, OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
10727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
10728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
10729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
10730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
10731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case SWVDEC_RECONFIG_INSUFFICIENT_RESOURCES:
10732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
107338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            SWVDEC_PROP prop;
10734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_HIGH("swvdec port settings changed");
10735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            in_reconfig = true;
10736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // get_buffer_req and populate port defn structure
107378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            prop.ePropId = SWVDEC_PROP_ID_DIMENSIONS;
107388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            SwVdec_GetProperty(m_pSwVdec, &prop);
107398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
107408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            update_resolution(prop.uProperty.sDimensions.nWidth,
107418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                prop.uProperty.sDimensions.nHeight,
107428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                prop.uProperty.sDimensions.nWidth,
107438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                prop.uProperty.sDimensions.nHeight);
10744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.video_resolution.stride =
10745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            (prop.uProperty.sDimensions.nWidth + 127) & (~127);
10746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.video_resolution.scan_lines =
10747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            (prop.uProperty.sDimensions.nHeight + 31) & (~31);
107488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
107498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_port_def.nPortIndex = 1;
107508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            update_portdef(&m_port_def);
107518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            //Set property for dimensions and attrb to SwVdec
10753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            SwVdec_SetProperty(m_pSwVdec,&prop);
10754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            prop.ePropId = SWVDEC_PROP_ID_FRAME_ATTR;
10755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            prop.uProperty.sFrameAttr.eColorFormat = SWVDEC_FORMAT_NV12;
10756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            SwVdec_SetProperty(m_pSwVdec,&prop);
10757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
10758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
10759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
10760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
107618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
107628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
107638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case SWVDEC_ERROR:
10764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
10765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_ERROR("swvdec fatal error");
10766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            post_event ((unsigned)NULL, VDEC_S_SUCCESS,\
10767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
10768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
107698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
107708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
107718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    case SWVDEC_RELEASE_BUFFER_REFERENCE:
107728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
107738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            SWVDEC_OPBUFFER* pOpBuffer = (SWVDEC_OPBUFFER *)pEvent->pEventData;
107748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (pOpBuffer == NULL)
107758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
107768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("swvdec release buffer reference for null buffer");
107778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
107788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            unsigned long idx = (unsigned long)pOpBuffer->pClientBufferData;
107798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("swvdec release buffer reference idx %lu", idx);
107808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (idx < drv_ctx.op_buf.actualcount)
107828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
107838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("swvdec REFERENCE RELEASE EVENT fd = %d offset = %u buf idx %lu pBuffer %p",
107848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ptr_outputbuffer[idx].pmem_fd, drv_ctx.ptr_outputbuffer[idx].offset,
107858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    idx, drv_ctx.ptr_outputbuffer[idx].bufferaddr);
107868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                buf_ref_remove(drv_ctx.ptr_outputbuffer[idx].pmem_fd,
107878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ptr_outputbuffer[idx].offset);
107888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
107898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
107908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
107918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    default:
107928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        break;
107938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
107948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
107958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    // put into the event command q
107968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    // m_cmd_q.insert_entry((unsigned int)NULL,
107978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //                    SWVDEC_S_SUCCESS,
107988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //                        OMX_COMPONENT_GENERATE_STOP_DONE_SWVDEC);
107998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //   post_message(this, OMX_COMPONENT_GENERATE_STOP_DONE_SWVDEC);
108008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
108018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
108028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::execute_input_flush_swvdec()
108038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
108048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int idx =0;
10805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long p1 = 0; // Parameter - 1
10806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long p2 = 0; // Parameter - 2
10807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long ident = 0;
108088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = true;
108098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
108108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("execute_input_flush_swvdec qsize %d, actual %d",
108118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_etb_q_swvdec.m_size, drv_ctx.interm_op_buf.actualcount);
108128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
108138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
108148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while (m_etb_q_swvdec.m_size)
108158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
108168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_BUFFERHEADERTYPE* bufHdr = NULL;
108178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_etb_q_swvdec.pop_entry(&p1,&p2,&ident);
108188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_ETB_SWVDEC)
108198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
108208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bufHdr = (OMX_BUFFERHEADERTYPE*)p2;
108218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
108228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if (ident == OMX_COMPONENT_GENERATE_EBD_SWVDEC)
108238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
108248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bufHdr = (OMX_BUFFERHEADERTYPE*)p1;
108258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
108268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        idx = (bufHdr - m_interm_mem_ptr);
108278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (idx >= 0 && idx < (int)drv_ctx.interm_op_buf.actualcount)
108288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
108298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("execute_input_flush_swvdec flushed buffer idx %d", idx);
108308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_interm_buf_state[idx] = WITH_COMPONENT;
108318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
108328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
108338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
108348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("execute_input_flush_swvdec issue: invalid idx %d", idx);
108358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
108368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
108378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_flush_swvdec_progress = false;
108388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
108398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
108408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for (idx = 0; idx < (int)drv_ctx.interm_op_buf.actualcount; idx++)
108418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
108428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Flush swvdec interm bufq idx %d, state %d", idx, m_interm_buf_state[idx]);
108438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // m_interm_buf_state[idx] = WITH_COMPONENT;
108448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
108458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
108468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return true;
108478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
108488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
108498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
108508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::execute_output_flush_dsp()
108518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
108528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int idx =0;
10853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long p1 = 0; // Parameter - 1
10854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long p2 = 0; // Parameter - 2
10855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long ident = 0;
108568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = true;
108578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
108588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("execute_output_flush_dsp qsize %d, actual %d",
108598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_ftb_q_dsp.m_size, drv_ctx.interm_op_buf.actualcount);
108608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
108618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_lock(&m_lock);
108628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    while (m_ftb_q_dsp.m_size)
108638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
108648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_BUFFERHEADERTYPE* bufHdr = NULL;
108658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_ftb_q_dsp.pop_entry(&p1,&p2,&ident);
108668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_FTB_DSP)
108678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
108688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bufHdr = (OMX_BUFFERHEADERTYPE*)p2;
108698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
108708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else if (ident == OMX_COMPONENT_GENERATE_FBD_DSP)
108718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
108728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bufHdr = (OMX_BUFFERHEADERTYPE*)p1;
108738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
108748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        idx = (bufHdr - m_interm_mem_ptr);
108758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (idx >= 0 && idx < (int)drv_ctx.interm_op_buf.actualcount)
108768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
108778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("execute_output_flush_dsp flushed buffer idx %d", idx);
108788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_interm_buf_state[idx] = WITH_COMPONENT;
108798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
108808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
108818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
108828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("execute_output_flush_dsp issue: invalid idx %d", idx);
108838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
108848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
108858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_flush_dsp_progress = false;
108868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_fill_internal_bufers = OMX_TRUE;
108878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    pthread_mutex_unlock(&m_lock);
108888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
108898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    for (idx = 0; idx < (int)drv_ctx.interm_op_buf.actualcount; idx++)
108908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
108918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Flush dsp interm bufq idx %d, state %d", idx, m_interm_buf_state[idx]);
108928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        // m_interm_buf_state[idx] = WITH_COMPONENT;
108938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
108948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return true;
108958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
108968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
108978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::free_interm_buffers()
108988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
108998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    free_extradata();
109008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
109018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.ptr_interm_outputbuffer)
109028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
109038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for(unsigned long i=0; i< drv_ctx.interm_op_buf.actualcount; i++)
109048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
109058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (drv_ctx.ptr_interm_outputbuffer[i].pmem_fd > 0)
109068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            {
10907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_LOW("Free interm ouput Buffer index = %lu addr = %p", i,
10908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    drv_ctx.ptr_interm_outputbuffer[i].bufferaddr);
109098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
109108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                munmap (drv_ctx.ptr_interm_outputbuffer[i].bufferaddr,
109118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    drv_ctx.ptr_interm_outputbuffer[i].mmaped_size);
109128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                close(drv_ctx.ptr_interm_outputbuffer[i].pmem_fd);
109138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.ptr_interm_outputbuffer[i].pmem_fd = 0;
109148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                free_ion_memory(&drv_ctx.interm_op_buf_ion_info[i]);
109158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
109168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
109178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
109188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
109198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_interm_mem_ptr)
109208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
109218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(m_interm_mem_ptr);
109228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_interm_mem_ptr = NULL;
109238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
109248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
109258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.ptr_interm_respbuffer)
109268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
109278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free (drv_ctx.ptr_interm_respbuffer);
109288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_interm_respbuffer = NULL;
109298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
109308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
109318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.ptr_interm_outputbuffer)
109328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
109338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free (drv_ctx.ptr_interm_outputbuffer);
109348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.ptr_interm_outputbuffer = NULL;
109358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
109368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
109378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (drv_ctx.interm_op_buf_ion_info) {
109388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(drv_ctx.interm_op_buf_ion_info);
109398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.interm_op_buf_ion_info = NULL;
109408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
109418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
109428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!in_reconfig || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)
109438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
109448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_pSwVdecIpBuffer)
109458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
109468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            free(m_pSwVdecIpBuffer);
109478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_pSwVdecIpBuffer = NULL;
109488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
109498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
109508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
109518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_pSwVdecOpBuffer)
109528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    {
109538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(m_pSwVdecOpBuffer);
109548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pSwVdecOpBuffer = NULL;
109558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
109568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
109578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_bEnabled = OMX_FALSE;
109588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_interm_bPopulated = OMX_FALSE;
109598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
109608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
109618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10962