1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
2e4010605f233a213cf0d972397bb33c34c364227Patrick TjinCopyright (c) 2013-2015, The Linux Foundation. All rights reserved.
3826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRedistribution and use in source and binary forms, with or without
5826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevmodification, are permitted provided that the following conditions are met:
6826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Redistributions of source code must retain the above copyright
7826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      notice, this list of conditions and the following disclaimer.
8826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Redistributions in binary form must reproduce the above copyright
9826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      notice, this list of conditions and the following disclaimer in the
10826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      documentation and/or other materials provided with the distribution.
116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    * Neither the name of The Linux Foundation nor
12826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      the names of its contributors may be used to endorse or promote
13826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      products derived from this software without specific prior written
14826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      permission.
15826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev--------------------------------------------------------------------------*/
28826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
29826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*============================================================================
30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            O p e n M A X   w r a p p e r s
31826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             O p e n  M A X   C o r e
32826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
33826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*//** @file omx_vdec.cpp
34826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  This module contains the implementation of the OpenMAX core & component.
35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
36826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*//*========================================================================*/
37826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//////////////////////////////////////////////////////////////////////////////
39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//                             Include Files
40826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//////////////////////////////////////////////////////////////////////////////
41826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
42826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <string.h>
43826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <pthread.h>
44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/prctl.h>
45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <stdlib.h>
46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <unistd.h>
47826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <errno.h>
486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include "omx_vdec_hevc.h"
49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <fcntl.h>
50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <limits.h>
516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <media/msm_media_info.h>
526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <qdMetaData.h>
53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_
55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/ioctl.h>
56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/mman.h>
57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <cutils/properties.h>
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef USE_EGL_IMAGE_GPU
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if  defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <gralloc_priv.h>
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h>
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h>
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_HANDLE_QCOM 0x4F00
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_OFFSET_QCOM 0x4F01
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0"
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME_LEN 30
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1;
79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0";
80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1;
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output.yuv";
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile;
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar ouputextradatafilename [] = "/data/extradata";
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef VENUS_HEVC
918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEVICE_NAME "/dev/video/venus_dec"
928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else
938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEVICE_NAME "/dev/video/q6_dec"
948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_INPUT_ERROR DEFAULT_FPS
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120
99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE        0xC5000000
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE_MASK   0xFF000000
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_AP_SEQ_START_CODE       0x0F010000
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_PROFILE_MASK   0xF0
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE          0
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_MAIN_PROFILE            1
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_ADVANCE_PROFILE         3
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_MED_LEVEL  2
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_LEN            4
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_POS            8
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_A_POS            12
113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_POS            24
114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SEQ_LAYER_SIZE          36
1156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define POLL_TIMEOUT 0x7fffffff
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/ion"
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
12161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanextern "C" {
12261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include<utils/Log.h>
12361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif//_ANDROID_
125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_4K 0x1000
1276eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_1M 0x100000
1286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define EXTRADATA_IDX(__num_planes) ((__num_planes) ? (__num_planes) - 1 : 0)
132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA)
1348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input)
136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
13761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer;
13861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
13961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pollfd pfd;
14061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer v4l2_buf;
14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event dqevent;
14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pfd.fd = omx->drv_ctx.video_driver_fd;
14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
1478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: Async thread start");
14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (1) {
15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = poll(&pfd, 1, POLL_TIMEOUT);
15161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc) {
1528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Poll timedout");
15361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (rc < 0) {
1558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error while polling: %d", rc);
15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_msginfo vdec_msg;
16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.length = omx->drv_ctx.num_planes;
16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.m.planes = plane;
16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (uint64_t)v4l2_buf.timestamp.tv_usec;
17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (vdec_msg.msgdata.output_frame.len) {
17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
1798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_msginfo vdec_msg;
18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.length = 1;
18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.m.planes = plane;
19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
1958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
19961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pfd.revents & POLLPRI) {
20161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
20261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
20361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved");
20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
21061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
21161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT ) {
21261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_INFO_CONFIG_CHANGED;
21461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved");
21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
21961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
22161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
22261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
22361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Flush Done Recieved");
22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
22761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
22861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
23061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Flush Done Recieved");
23261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
23461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
23561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
23661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
2378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Close Done Recieved and async_message_thread Exited");
23861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
23961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
24061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
24161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR;
24261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("SYS Error Recieved");
24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
24661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
24761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
2498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Some Event recieved");
25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                continue;
25161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
25361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop");
25561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input)
259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
26061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
26161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char id;
26261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int n;
26361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx == NULL) {
2648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("message thread null pointer rxd");
26561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: message thread start");
26961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
27061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (1) {
271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
27261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        n = read(omx->m_pipe_in, &id, 1);
273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
27461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (0 == n) {
27561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
27661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
27861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (1 == n) {
27961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->process_event_cb(omx, id);
28061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
28161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((n < 0) && (errno != EINTR)) {
2828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno);
28361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
28461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: message thread stop");
28761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id)
291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
29261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret_value;
2936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
29461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx == NULL) {
2958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("message thread null pointer rxd");
29661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
29761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out);
29961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret_value = write(omx->m_pipe_out, &id, 1);
3008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value);
301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor
304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue()
305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
30661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Nothing to do
307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor
310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    memset(m_q,0,sizeof(m_q));
313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert
316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
31861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
31961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
32061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].id       = id;
32161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].param1   = p1;
32261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].param2   = p2;
32361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_write++;
32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_size ++;
32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_write = 0;
32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
3308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__);
33161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
33261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop
336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
33861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
33961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_size > 0) {
34061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *id = m_q[m_read].id;
34161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *p1 = m_q[m_read].param1;
34261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *p2 = m_q[m_read].param2;
34361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Move the read pointer ahead
34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ++m_read;
34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        --m_size;
34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_read = 0;
34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
34961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
35061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
35161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
35261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue
356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return m_q[m_read].id;
359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list()
363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
36461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //initialize timestamps array
36561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_ts_arr_list, 0, sizeof(m_ts_arr_list) );
366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list()
368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
36961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //free m_ts_arr_list?
370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
37461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
37561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool duplicate_ts = false;
37661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
37761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
37861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //insert at the first available empty location
37961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_ts_arr_list[idx].valid) {
38161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //found invalid or empty entry, save timestamp
38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_ts_arr_list[idx].valid = true;
38361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_ts_arr_list[idx].timestamp = ts;
38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ts, idx);
38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
39161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
39261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
39361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
39461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
39961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
40061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int min_idx = -1;
40161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_TICKS min_ts = 0;
40261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
40361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
40461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_ts_arr_list[idx].valid) {
40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //found valid entry, save index
40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (min_idx < 0) {
40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //first valid entry
41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_ts = m_ts_arr_list[idx].timestamp;
41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_idx = idx;
41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (m_ts_arr_list[idx].timestamp < min_ts) {
41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_ts = m_ts_arr_list[idx].timestamp;
41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_idx = idx;
41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
41961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (min_idx < 0) {
42161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //no valid entries found
42261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
42361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ts = 0;
42461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
42561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ts = m_ts_arr_list[min_idx].timestamp;
42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ts_arr_list[min_idx].valid = false;
42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ts, min_idx);
43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
43261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list()
438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
43961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
44061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
44161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
44261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
44361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
44461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ts_arr_list[idx].valid = false;
44561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
44661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances
451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void)
452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
45361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return (new omx_vdec);
454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
459f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        ion_user_handle_t handle, int ionMapfd)
460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
46161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base)
465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // dup file descriptor, map once, use pmem
467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    init(dup(fd), base, size, 0 , MEM_DEVICE);
468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_
471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
47261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
47361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::omx_vdec
474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
47561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Constructor
477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None
480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
48361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::omx_vdec(): m_error_propogated(false),
48561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_state(OMX_StateInvalid),
48661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_app_data(NULL),
48761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_mem_ptr(NULL),
48861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr(NULL),
48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_err_count(0),
49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_flush_progress (false),
49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_flush_progress (false),
49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_use_buffer (false),
49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_use_buffer (false),
49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers(false),
49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_use_output_pmem(OMX_FALSE),
49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_region_smi(OMX_FALSE),
49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_pvt_entry_pmem(OMX_FALSE),
49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_input_buffers(0),
49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers(0),
50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bm_count(0),
50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bm_count(0),
50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bPopulated(OMX_FALSE),
50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bPopulated(OMX_FALSE),
50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_flags(0),
505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr(NULL),
507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
50861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bEnabled(OMX_TRUE),
50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bEnabled(OMX_TRUE),
51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_in_alloc_cnt(0),
51161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list(NULL),
51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry(NULL),
51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info(NULL),
51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    arbitrary_bytes (true),
51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    psource_frame (NULL),
51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pdest_frame (NULL),
51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_heap_ptr (NULL),
51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_phdr_pmem_ptr(NULL),
51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_inp_bm_count (0),
52061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    codec_type_parse ((codec_type)0),
52161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame_meta (true),
52261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_count (0),
52361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nal_count (0),
52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nal_length(0),
52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    look_ahead_nal (false),
52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame(0),
52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_buffer(NULL),
52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame_size (0),
52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_device_file_ptr(NULL),
53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_vc1_profile((vc1_profile_type)0),
53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_last_au_ts(LLONG_MAX),
53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_last_au_flags(0),
53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prev_ts(LLONG_MAX),
53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rst_prev_ts(true),
53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frm_int(0),
53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    in_reconfig(false),
53761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_display_id(NULL),
53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_parser(NULL),
53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    client_extradata(0),
540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
54161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_enable_android_native_buffers(OMX_FALSE),
54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_use_android_native_buffers(OMX_FALSE),
543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
54461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_desc_buffer_ptr(NULL),
54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    secure_mode(false)
546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
54761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Assumption is that , to begin with , we have all the frames with decoder */
54861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
55061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char property_value[PROPERTY_VALUE_MAX] = {0};
5518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.debug.level", property_value, "1");
5528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    debug_level = atoi(property_value);
5538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
5548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.perf", property_value, "0");
55661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    perf_flag = atoi(property_value);
55761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
55861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
55961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dec_time.start();
56061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        proc_frms = latency = 0;
56161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_value[0] = '\0';
56361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.ts", property_value, "0");
56461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_timestamp = atoi(property_value);
56561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.set_timestamp_reorder_mode(true);
56861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.enable_debug_print(true);
56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
57061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
57161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_value[0] = '\0';
57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.concealedmb", property_value, "0");
57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_concealedmb = atoi(property_value);
57461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_cmp,0,sizeof(m_cmp));
57861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_cb,0,sizeof(m_cb));
57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&drv_ctx,0,sizeof(drv_ctx));
58061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
58161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
58261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_demux_offsets, 0, sizeof(m_demux_offsets) );
58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
5846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_
58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
5866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.timestamp_adjust = false;
58961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.video_driver_fd = -1;
59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_vendor_config.pData = NULL;
59161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&m_lock, NULL);
59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&c_lock, NULL);
59361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    sem_init(&m_cmd_lock,0,0);
59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    streaming[CAPTURE_PORT] =
59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        streaming[OUTPUT_PORT] = false;
596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char extradata_value[PROPERTY_VALUE_MAX] = {0};
59861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.extradata", extradata_value, "0");
59961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_extradata = atoi(extradata_value);
60061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    client_buffers.set_vdec_client(this);
6046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
6056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
6066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic const int event_type[] = {
60761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
60861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
60961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
61061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
61161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_SYS_ERROR
6126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal};
6136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
6146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE subscribe_to_events(int fd)
6156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
61761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
61961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
62061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
6218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
62261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
62861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
6308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type);
63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < array_sz) {
63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (--i; i >=0 ; i--) {
63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(&sub, 0, sizeof(sub));
63761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sub.type = event_type[i];
63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc)
6408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorNotImplemented;
64361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
64461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE unsubscribe_to_events(int fd)
6496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
65061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
65161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
65261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
65361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
65461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
6558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
65661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
66061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
66361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
6648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
66561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
66661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
66861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
6696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
6706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::~omx_vdec
674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
67661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Destructor
677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
67861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
67961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None
680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec()
685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info = NULL;
68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_decoder_cmd dec;
68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("In OMX vdec Destructor");
68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_pipe_in) close(m_pipe_in);
69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_pipe_out) close(m_pipe_out);
69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pipe_in = -1;
69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pipe_out = -1;
69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_join(msg_thread_id,NULL);
69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dec.cmd = V4L2_DEC_CMD_STOP;
69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
6988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("STOP Command failed");
69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_join(async_thread_id,NULL);
70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsubscribe_to_events(drv_ctx.video_driver_fd);
70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    close(drv_ctx.video_driver_fd);
70361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_destroy(&m_lock);
70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_destroy(&c_lock);
70561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    sem_destroy(&m_cmd_lock);
70661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dec_time.end();
70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
71361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
71461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
71561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
71661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
71761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
71861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
71961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.count = 0;
72061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
72361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
7246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
7256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
72761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::OMXCntrlProcessMsgCb
729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
73061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
73161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL Client callbacks are generated through this routine. The decoder
73261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   provides the thread context for this routine.
733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
73461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ctxt -- Context information related to the self.
73661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   id   -- Event identifier. This could be any of the following:
73761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   1. Command completion event
73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   2. Buffer done callback event
73961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   3. Frame done callback event
740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    signed int p1; // Parameter - 1
74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    signed int p2; // Parameter - 2
74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int ident;
75061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int qsize=0; // qsize
75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec *pThis = (omx_vdec *) ctxt;
75261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
75361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!pThis) {
7548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out",
75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__);
75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
75961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Protect the shared queue data structure
76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    do {
76161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Read the message id's from the queue*/
76261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&pThis->m_lock);
76361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qsize = pThis->m_cmd_q.m_size;
76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize) {
76561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
76661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize = pThis->m_ftb_q.m_size;
77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (qsize) {
77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize = pThis->m_etb_q.m_size;
77761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (qsize) {
77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
78161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&pThis->m_lock);
78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*process message if we have one*/
78461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize > 0) {
78561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id = ident;
78661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch (id) {
78761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT:
78861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        switch (p1) {
79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandStateSet:
79161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = (OMX_STATETYPE) p2;
7928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d",
79361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->m_state);
79461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
79561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL);
79661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
79761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
79861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_EventError:
79961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (p2 == OMX_StateInvalid) {
8008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid");
80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_state = (OMX_STATETYPE) p2;
80261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
80361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
80461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else if (p2 == OMX_ErrorHardware) {
80561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->omx_report_error();
80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else {
80761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
80861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventError, p2, (OMX_U32)NULL, NULL );
80961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandPortDisable:
8138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%d]", p2);
81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    break;
81861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
81961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig) {
82061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    OMX_ERRORTYPE eRet = OMX_ErrorNone;
82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
8238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("Failed to release output buffers");
82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->in_reconfig = false;
82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (eRet !=  OMX_ErrorNone) {
82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
82861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error();
82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandPortEnable:
8368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%d]", p2);
83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            default:
84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
8488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
85361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
8548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure");
85561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_ETB:
85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
8618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure");
86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_FTB:
86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
8698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure");
87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_COMMAND:
87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
87661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (OMX_U32)p2,(OMX_PTR)NULL);
87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EBD:
88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
88161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
8828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure");
88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_inp_err_count++;
88761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->time_stamp_dts.remove_time_stamp(
88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ?true:false);
89161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_inp_err_count = 0;
89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ( pThis->empty_buffer_done(&pThis->m_cmp,
89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
8968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("empty_buffer_done failure");
89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_inp_err_count >= MAX_INPUT_ERROR) {
9008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
90161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
90361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
90561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    {
90761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        int64_t *timestamp = (int64_t *)p1;
90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p1) {
90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->time_stamp_dts.remove_time_stamp(*timestamp,
91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ?true:false);
91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            free(timestamp);
91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
91561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_FBD:
91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 != VDEC_S_SUCCESS) {
9188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure");
91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
9228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("fill_buffer_done failure");
92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
92561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
92761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
9288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Driver flush i/p Port complete");
92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!pThis->input_flush_progress) {
9308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->execute_input_flush();
93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (p2 != VDEC_S_SUCCESS) {
9358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->omx_report_error ();
93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else {
93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                /*Check if we need generate event for Flush done*/
93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
94061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
9428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_LOW("Input Flush completed - Notify Client");
94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventCmdComplete,OMX_CommandFlush,
94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_CORE_INPUT_PORT_INDEX,NULL );
94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
94761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_IDLE_PENDING)) {
94961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
9508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port");
95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error ();
95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    } else {
95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->streaming[OUTPUT_PORT] = false;
95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
95561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (!pThis->output_flush_progress) {
9568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_LOW("Input flush done hence issue stop");
95761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_GENERATE_STOP_DONE);
95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
96161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
96361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
9698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Driver flush o/p Port complete");
97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!pThis->output_flush_progress) {
9718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->execute_output_flush();
97461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (p2 != VDEC_S_SUCCESS) {
9768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->omx_report_error ();
97861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else {
97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                /*Check if we need generate event for Flush done*/
98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
98161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
9828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_LOW("Notify Output Flush done");
98361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventCmdComplete,OMX_CommandFlush,
98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_CORE_OUTPUT_PORT_INDEX,NULL );
98761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
98961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
9908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_LOW("Internal flush complete");
99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,
99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (BITMASK_PRESENT(&pThis->m_flags,
99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
99561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->post_event(OMX_CommandPortDisable,
99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_CORE_OUTPUT_PORT_INDEX,
99761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_GENERATE_EVENT);
99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        BITMASK_CLEAR (&pThis->m_flags,
99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
100261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
100361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
10068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port");
100761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error ();
100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->streaming[CAPTURE_PORT] = false;
101161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (!pThis->input_flush_progress) {
10128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_LOW("Output flush done hence issue stop");
101361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
101461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_GENERATE_STOP_DONE);
101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
101761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
101961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
102061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_START_DONE:
10258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE");
102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
10298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure");
103061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
10328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success");
103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
10348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("Move to executing");
103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                // Send the callback now
103661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
103761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StateExecuting;
103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
103961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StateExecuting, NULL);
104161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else if (BITMASK_PRESENT(&pThis->m_flags,
104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_COMPONENT_PAUSE_PENDING)) {
104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (/*ioctl (pThis->drv_ctx.video_driver_fd,
104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) {
10458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed");
104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->omx_report_error ();
104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
105061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
10518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("Event Handler callback is NULL");
105261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_PAUSE_DONE:
10568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
105861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
105961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
106161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->complete_pending_buffer_done_cbs();
106361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
10648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                //Send the callback now
106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StatePause;
106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
106961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
107061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StatePause, NULL);
107161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
107761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
107861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_RESUME_DONE:
10808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
108161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
108261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
10838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed");
108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
108561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
10878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("Moving the decoder to execute state");
108861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                // Send the callback now
108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StateExecuting;
109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StateExecuting,NULL);
109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_STOP_DONE:
11038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
11068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->complete_pending_buffer_done_cbs();
111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
11118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success");
111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                // Send the callback now
111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StateIdle;
11158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("Move to Idle State");
111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StateIdle,NULL);
111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
11288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 == OMX_IndexParamPortDefinition) {
113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->in_reconfig = true;
113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
113361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
113561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_EventPortSettingsChanged, p1, p2, NULL );
113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
113761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) {
114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
114361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
114461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            format = OMX_InterlaceInterleaveFrameTopFieldFirst;
114561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        else //unsupported interlace format; raise a error
114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            event = OMX_EventError;
114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    event, format, 0, NULL );
115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EOS_DONE:
11598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
116261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
116361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
116461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
116561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
116661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->prev_ts = LLONG_MAX;
116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->rst_prev_ts = true;
116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
11718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
117261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->omx_report_error ();
117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
117461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
117561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    {
11768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
117761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
117861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
117961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
118061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
118161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
118261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
118361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
118461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
118561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
118661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
118861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&pThis->m_lock);
118961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qsize = pThis->m_cmd_q.m_size;
119061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pThis->m_state != OMX_StatePause)
119161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
119261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&pThis->m_lock);
119361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } while (qsize>0);
1194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::update_resolution(int width, int height)
11986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
11996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.frame_height = height;
12006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.frame_width = width;
12016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.scan_lines = height;
12026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.stride = width;
12036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nLeft = 0;
12046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nTop = 0;
12056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nWidth = drv_ctx.video_resolution.frame_width;
12066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nHeight = drv_ctx.video_resolution.frame_height;
12076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
1208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
121061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
121161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentInit
1212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
121361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
121461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Initialize the component.
1215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
121661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
121761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ctxt -- Context information related to the self.
121861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   id   -- Event identifier. This could be any of the following:
121961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   1. Command completion event
122061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   2. Buffer done callback event
122161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   3. Frame done callback event
1222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
122361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
122661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
1228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
123061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_fmtdesc fdesc;
123261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
123361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
123461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
123561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int   alignment = 0,buffer_size = 0;
123661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fds[2];
123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int r,ret=0;
123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool codec_ambiguous = false;
12398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_STRING device_name = (OMX_STRING)DEVICE_NAME;
12408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Opening device %s", device_name);
124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.video_driver_fd = open(device_name, O_RDWR);
124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
12438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec::component_init(): Open device %s returned fd %d, errno %d",
124461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            device_name, drv_ctx.video_driver_fd, errno);
124561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
124661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.video_driver_fd == 0) {
124761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.video_driver_fd = open(device_name, O_RDWR);
124861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
124961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
125061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.video_driver_fd < 0) {
12518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno);
125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
125361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.frame_rate.fps_denominator = 1;
1256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
12576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    ret = pthread_create(&async_thread_id,0,async_message_thread,this);
125861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret < 0) {
125961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(drv_ctx.video_driver_fd);
12608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to create async_message_thread");
126161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
126261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
126561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
1266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    outputBufferFile1 = fopen (outputfilename, "ab");
1269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
127161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    outputExtradataFile = fopen (ouputextradatafilename, "ab");
1272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
127461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Copy the role information which provides the decoder kind
127561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    strlcpy(drv_ctx.kind,role,128);
127661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
127761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
127861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
127961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
128061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE);
128161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.timestamp_adjust = true;
128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
128361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingMPEG4;
128461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_MPEG4;
128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Initialize Start Code for MPEG4*/
128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_MPEG4;
128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "m4v");
1290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
129361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE);
129561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
129661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_MPEG2;
129761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingMPEG2;
129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Initialize Start Code for MPEG2*/
129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_MPEG2;
130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "mpg");
1303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
130661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
13078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("H263 Decoder selected");
130861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingH263;
131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_H263;
131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_H263;
131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
131461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "263");
1315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
131861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
13198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW ("DIVX 311 Decoder selected");
132061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX_311;
132261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
132461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
132561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
132661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
132761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
132861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
13298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected");
133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX;
133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_ambiguous = true;
133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
133961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
13408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected");
134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX;
134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_ambiguous = true;
134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
134861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_H264;
135361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingAVC;
135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_H264;
135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
1357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "264");
1359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\
136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC;
136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_HEVC;
136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc;
136661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_HEVC;
136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
136861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
13696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef INPUT_BUFFER_LOG
137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "265");
13716eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingWMV;
137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VC1;
137861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "vc1");
1382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingWMV;
138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VC1;
138961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
139261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "vc1");
1393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
139461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",\
139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_VP8;
13985aa03230fef7a43a61e1ac5f19a2c5a71e5d6df7Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingVP8;
139961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VP8;
140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        arbitrary_bytes = false;
140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
14028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Unknown Component");
140361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInvalidComponentName;
140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    inputBufferFile1 = fopen (inputfilename, "ab");
1407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
1409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
14116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
14126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
14136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        if (!client_buffers.set_color_format(dest_color_format)) {
14148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Setting color format failed");
14156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            eRet = OMX_ErrorInsufficientResources;
14166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
1417dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        capture_capability= V4L2_PIX_FMT_NV12;
141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = subscribe_to_events(drv_ctx.video_driver_fd);
142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
14218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Subscribe Event Failed");
142261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
142361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
142461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
142561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_capability cap;
142661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
14288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to query capabilities");
142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
143061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
14328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    " version = %d, capabilities = %x", cap.driver, cap.card,
143361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    cap.bus_info, cap.version, cap.capabilities);
143461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
143561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret=0;
143661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
143761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.index=0;
143861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
14398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
144061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fdesc.pixelformat, fdesc.flags);
144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fdesc.index++;
144261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
144461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.index=0;
144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
14478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
144861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fdesc.pixelformat, fdesc.flags);
144961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fdesc.index++;
145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
14516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        update_resolution(320, 240);
145261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
145361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
145561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
145761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
145861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
14598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set format on output port");
146061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
14618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set Format was successful");
146261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_ambiguous) {
146361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (output_capability == V4L2_PIX_FMT_DIVX) {
146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control divx_ctrl;
146561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
146661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
146861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
147061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
147261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
147461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (ret) {
14778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Failed to set divx version");
147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
147961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
148061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Codec should not be ambiguous");
148161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
148261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
148361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
148461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
14918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set format on capture port");
149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
14938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set Format was successful");
149461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode) {
149561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
149661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = 1;
14978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret);
149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ret) {
15008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret);
150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(drv_ctx.video_driver_fd);
150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Get the Buffer requirements for input and output ports*/
150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode) {
151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.op_buf.alignment=SZ_1M;
151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf.alignment=SZ_1M;
151261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.op_buf.alignment=SZ_4K;
151461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf.alignment=SZ_4K;
151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata = 0;
151861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.idr_only_decoding = 0;
1523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
15246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        m_state = OMX_StateLoaded;
1525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA
15266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        if (eRet == OMX_ErrorNone && !secure_mode)
15276eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            enable_extradata(DEFAULT_EXTRADATA, true, true);
1528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
15296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        eRet=get_buffer_req(&drv_ctx.ip_buf);
15308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Input Buffer Size =%d",drv_ctx.ip_buf.buffer_size);
15316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        get_buffer_req(&drv_ctx.op_buf);
153261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC) {
153461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
153561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
153661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFilledLen = 0;
153761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nOffset = 0;
153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.pBuffer == NULL) {
15408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed ");
154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
154561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
154661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_frame_parser.mutils == NULL) {
154761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_frame_parser.mutils = new H264_Utils();
154861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
154961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_frame_parser.mutils == NULL) {
15508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("parser utils Allocation failed ");
155161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorInsufficientResources;
155261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
155361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_frame_parser.mutils->initialize_frame_checking_environment();
155461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_parser = new h264_stream_parser();
155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!h264_parser) {
156061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
156561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pipe(fds)) {
15668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("pipe creation failed");
156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
156861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
156961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int temp1[2];
157061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (fds[0] == 0 || fds[1] == 0) {
157161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pipe (temp1)) {
15728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("pipe creation failed");
157361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
15746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                }
157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //close (fds[0]);
157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //close (fds[1]);
157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fds[0] = temp1 [0];
157861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fds[1] = temp1 [1];
157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
158061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pipe_in = fds[0];
158161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pipe_out = fds[1];
158261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            r = pthread_create(&msg_thread_id,0,message_thread,this);
158361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (r < 0) {
15858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("component_init(): message_thread creation failed");
158661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
158761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
158861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
158961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
15906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
159161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet != OMX_ErrorNone) {
15928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Component Init Failed");
15938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Calling VDEC_IOCTL_STOP_NEXT_MSG");
159461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
159561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                NULL);
15968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Calling close() on Video Driver");
159761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close (drv_ctx.video_driver_fd);
159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.video_driver_fd = -1;
159961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
16008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("omx_vdec::component_init() success");
160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
160261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
1604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
160861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetComponentVersion
1609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
161161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns the component version.
1612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
161361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
161461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   TBD.
1615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
161661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
161761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX_ErrorNone.
1618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
161961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_component_version
162161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(
162261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp,
162361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STRING componentName,
162461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* componentVersion,
162561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* specVersion,
162661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_UUIDTYPE* componentUUID
162761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan )
1628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
162961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
16308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State");
1631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
1632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
163361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* TBD -- Return the proper version */
163461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (specVersion) {
163561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        specVersion->nVersion = OMX_SPEC_VERSION;
163661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
163761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
1638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
164061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
164161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommand
1642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
164361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
164461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
1645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
164661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
164761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
164961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
165061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
1651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
165261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
165461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_COMMANDTYPE cmd,
165561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32 param1,
165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR cmdData
165761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
1658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
16598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command: Recieved a Command from Client");
166061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
16618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State");
1662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
1663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
166561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
16668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush "
166761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "to invalid port: %lu", param1);
166861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
1669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
1671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sem_wait(&m_cmd_lock);
16728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command: Command Processed");
1673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
167861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommand
1679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
168061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
168161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
1682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
168361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
168461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
168761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
1688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
169161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_COMMANDTYPE cmd,
169261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32 param1,
169361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR cmdData
169461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
1695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
169661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
169761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
169861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int bFlag = 1,sem_posted = 0,ret=0;
169961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd);
17018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d",
170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_state, eState);
170361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
170461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (cmd == OMX_CommandStateSet) {
17058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued");
17068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState);
170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
170861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Loaded */
170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_state == OMX_StateLoaded) {
171161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateIdle) {
171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //if all buffers are allocated or all ports disabled
171361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (allocate_done() ||
171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
17158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle");
171661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
17178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending");
171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // Skip the event notification
172061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
172361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Loaded */
172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
17258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded");
172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
172761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
172861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
172961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
173061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to WaitForResources */
173161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
173361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
17348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources");
173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Executing */
173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
17388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing");
173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
174061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
174361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Pause */
174461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
17458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause");
174661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
174761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
174861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
174961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Invalid */
175161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
17528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid");
175361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
175461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
175561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
17568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\
175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eState);
175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
175961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
176161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is IDLE */
176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
176561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateIdle) {
176661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateLoaded) {
176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (release_done()) {
176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    /*
176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       Since error is None , we will post an event at the end
177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       of this function definition
177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     */
17728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded");
177361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
17748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending");
177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // Skip the event notification
177761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Executing */
178161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
17828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
178361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
178461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
17858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
178661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state=OMX_StateExecuting;
17878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful");
178861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
178961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Idle */
179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateIdle) {
17918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle");
179261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
179361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
179561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to WaitForResources */
179761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
17988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources");
179961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
180261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
180361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Pause */
180461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
180561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*To pause the Video core we need to start the driver*/
180661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
180761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      NULL) < */0) {
18088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED");
180961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
181061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorHardware;
181161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
181261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
18138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause");
181461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
181561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
181661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
181761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Invalid */
181861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
18198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid");
182061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
182161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
182261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
18238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState);
182461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
182561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1826dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
1827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
182861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /******************************/
182961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Executing */
183061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /******************************/
183161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateExecuting) {
18328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting");
183361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Idle */
183461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateIdle) {
183561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
183661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition
183761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 */
18388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle");
183961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
184061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!sem_posted) {
184161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_posted = 1;
184261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_post (&m_cmd_lock);
184361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_ALL);
184461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
184561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
184661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
184761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Paused */
184861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
18498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("PAUSE Command Issued");
185061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state = OMX_StatePause;
185161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
185261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
185361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Loaded */
185461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
18558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded");
185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
185761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
185861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
185961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
186061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to WaitForResources */
186161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
18628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources");
186361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
186461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
186561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
186661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
186761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Executing */
186861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
18698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing");
187061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
187161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
187261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
187361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
187461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Invalid */
187561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
18768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid");
187761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
187861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
187961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
18808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState);
188161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
188261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
188361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
188461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
188561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Pause  */
188661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
188761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StatePause) {
188861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Executing */
188961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateExecuting) {
18908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pause --> Executing");
189161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state = OMX_StateExecuting;
189261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
189361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
189461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Idle */
189561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateIdle) {
189661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
189761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
18988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pause --> Idle");
189961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
190061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!sem_posted) {
190161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_posted = 1;
190261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_post (&m_cmd_lock);
190361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_ALL);
190461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
190561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
190661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
190761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to loaded */
190861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
19098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> loaded");
191061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
191161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
191261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
191361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
191461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to WaitForResources */
191561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
19168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> WaitForResources");
191761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
191861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
191961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
192061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
192161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Pause */
192261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
19238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> Pause");
192461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
192561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
192661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
192761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
192861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Invalid */
192961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
19308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> Invalid");
193161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
193261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
193361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
19348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState);
193561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
193661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
193761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
193861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
193961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is WaitForResources  */
194061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
194161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateWaitForResources) {
194261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Loaded */
194361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateLoaded) {
194461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
194561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
19468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded");
194761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
194861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to WaitForResources */
194961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
19508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources");
195161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,
195261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
195361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
195461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
195561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Executing */
195661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
19578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing");
195861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
195961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
196061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
196161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
196261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Pause */
196361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
19648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause");
196561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
196661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
196761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
196861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
196961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Invalid */
197061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
19718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid");
197261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
197361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
197461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
197561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Loaded -
197661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan               is NOT tested by Khronos TS */
197761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
197861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
19798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState);
198061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
198161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
198361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /********************************/
198461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Current State is Invalid */
198561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*******************************/
198661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (m_state == OMX_StateInvalid) {
198761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* State Transition from Inavlid to any state */
198861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
198961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || OMX_StateIdle || OMX_StateExecuting
199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || OMX_StatePause || OMX_StateInvalid)) {
19918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded");
199261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_EventError,OMX_ErrorInvalidState,\
199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
199461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInvalidState;
1995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (cmd == OMX_CommandFlush) {
19978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued"
199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "with param1: %lu", param1);
199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
200061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
200261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
200361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
200461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
200561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!sem_posted) {
200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sem_posted = 1;
20078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Set the Semaphore");
200861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sem_post (&m_cmd_lock);
200961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            execute_omx_flush(param1);
201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bFlag = 0;
201261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ( cmd == OMX_CommandPortEnable) {
20138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued"
201461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "with param1: %lu", param1);
201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
201661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bEnabled = OMX_TRUE;
201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
201861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( (m_state == OMX_StateLoaded &&
201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
202061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || allocate_input_done()) {
202161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
202261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
202361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
20248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
202561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
202861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
203061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
20318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Enable output Port command recieved");
203261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bEnabled = OMX_TRUE;
203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
203461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( (m_state == OMX_StateLoaded &&
203561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
203661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || (allocate_output_done())) {
203761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
2038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
2039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
204061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
20418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
204261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
204361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
204461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
204561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
204661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
204761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (cmd == OMX_CommandPortDisable) {
20488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued"
204961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "with param1: %lu", param1);
205061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
205161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bEnabled = OMX_FALSE;
205261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
205361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    && release_input_done()) {
205461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
2055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
205661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
205761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
205861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
205961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!sem_posted) {
206061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_posted = 1;
206161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_post (&m_cmd_lock);
206261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
206361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
206461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
206561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
206661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
206761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
206861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
206961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
207161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bEnabled = OMX_FALSE;
20728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Disable output Port command recieved");
207361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
207461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    && release_output_done()) {
207561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
2076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
207761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
207861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
207961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
208061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!sem_posted) {
208161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_posted = 1;
208261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_post (&m_cmd_lock);
208361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
208461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
208561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
208661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
208761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
208861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
208961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
209061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
209161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
209261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
20938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd);
209461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorNotImplemented;
209561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
209661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone && bFlag) {
209761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
209861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
209961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!sem_posted) {
210061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sem_post(&m_cmd_lock);
210161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ExecuteOmxFlush
2109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Executes the OMX flush.
2112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
211361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
211461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   flushtype - input flush(1)/output flush(0)/ both.
2115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
211661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
211761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
2118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType)
2121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane;
212461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer v4l2_buf;
212561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_decoder_cmd dec;
212661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("in %s", __func__);
212761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
212861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
212961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (flushType) {
213061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_CORE_INPUT_PORT_INDEX:
213161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input_flush_progress = true;
213261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT;
213361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_CORE_OUTPUT_PORT_INDEX:
213561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            output_flush_progress = true;
213661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
213861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
213961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input_flush_progress = true;
214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            output_flush_progress = true;
214161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT |
214261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
214361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
214461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
21468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Flush Port (%lu) Failed ", flushType);
214761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = false;
214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
2153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush
2154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
215661a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at OUTPUT PORT.
2157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
215961a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone.
2160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
216261a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false
2163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
2164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush()
2165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
216661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p1 = 0; // Parameter - 1
216761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p2 = 0; // Parameter - 2
216861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      ident = 0;
216961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = true;
217061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Generate FBD for all Buffers in the FTBq*/
217261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
21738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Initiate Output Flush");
217461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_ftb_q.m_size) {
21758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer queue size %d pending buf cnt %d",
217661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_ftb_q.m_size,pending_output_buffers);
217761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.pop_entry(&p1,&p2,&ident);
21788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("ID(%x) P1(%x) P2(%x)", ident, p1, p2);
217961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == m_fill_output_msg ) {
218061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
218161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
218261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
218361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
218461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
218561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
218661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_flush_progress = false;
218761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
218861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = LLONG_MAX;
219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
219161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
21928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
2196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush
2197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
219961a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at INPUT PORT.
2200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
220261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone.
2203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
220561a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false
2206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
2207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush()
2208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
220961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned       i =0;
221061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p1 = 0; // Parameter - 1
221161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p2 = 0; // Parameter - 2
221261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      ident = 0;
221361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = true;
221461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
221561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Generate EBD for all Buffers in the ETBq*/
22168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Initiate Input Flush");
221761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
221861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
22198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Check if the Queue is empty");
222061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_etb_q.m_size) {
222161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.pop_entry(&p1,&p2,&ident);
222261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
222361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
22248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
222561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
222661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
222761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_input_buffers++;
22288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
222961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
223061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
223161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
22328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p",
223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p1);
223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
223761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    time_stamp_dts.flush_timestamp();
223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Check if Heap Buffers are to be flushed*/
22398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (arbitrary_bytes && !(codec_config_flag)) {
22408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Reset all the variables before flusing");
224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_scratch.nFilledLen = 0;
224261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_count = 0;
224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_count = 0;
224561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_ts = LLONG_MAX;
224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_flags = 0;
224761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_entries = 0;
22498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Initialize parser");
225061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils) {
225161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils->initialize_frame_checking_environment();
225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
225361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
225461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (m_input_pending_q.m_size) {
225561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&p1,&p2,&ident);
225661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
225761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
225861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
225961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame) {
226061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
226161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
226261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
226361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame) {
226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFilledLen = 0;
226661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL,
226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned int)NULL);
226861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = NULL;
226961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
227061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.flush();
22718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (codec_config_flag) {
22728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
22738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "is not sent to the driver yet");
227461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
227561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
227661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_flush_progress = false;
227761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes) {
227861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = LLONG_MAX;
227961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
228061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
228261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
228361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_timestamp_list.reset_ts_list();
228461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
22868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
228761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
229261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
229361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommandEvent
2294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
229561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
229661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Send the event to decoder pipe.  This is needed to generate the callbacks
229761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   in decoder thread context.
2298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
229961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
230061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
2301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
230261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::post_event(unsigned int p1,
230761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int p2,
230861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int id)
2309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
231061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet      =                      false;
231161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
231261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
231361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
231461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
231561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (id == m_fill_output_msg ||
231661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_FBD) {
231761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.insert_entry(p1,p2,id);
231861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (id == OMX_COMPONENT_GENERATE_ETB ||
231961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_EBD ||
232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
232161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.insert_entry(p1,p2,id);
232261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
232361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cmd_q.insert_entry(p1,p2,id);
232461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
232561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
232661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet = true;
23278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this);
232861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    post_message(this, id);
232961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
2336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
233761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNoMore;
233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!profileLevelType)
233961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
234061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
234161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (profileLevelType->nPortIndex == 0) {
234261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
234661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
234861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
235061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 2) {
235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
235361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
23548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d",
235561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        profileLevelType->nProfileIndex);
235661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
235761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
235861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
235961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // TODO
236061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
23618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d",
236261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        profileLevelType->nProfileIndex);
236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
236661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
236761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
23708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
237461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
237561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
237761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
23818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
238261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
238461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
238561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
238661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
238961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
239161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
239261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
239361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
23948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
239561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
239661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
239761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
239861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
23998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu", profileLevelType->nPortIndex);
240061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
240261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
240661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
240761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetParameter
2408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
240961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
241061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Get Parameter method implementation
2411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
241261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
241361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
241561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Error None if successful.
2417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
241861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
242061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE paramIndex,
242161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_PTR     paramData)
2422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
24258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_parameter:");
242661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
24278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Param in Invalid State");
2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
243061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (paramData == NULL) {
24318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Get Param in Invalid paramData");
2432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
243461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)paramIndex) {
243561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition:
243661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
243761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
243861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
24398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition");
244061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = update_portdef(portDefn);
244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (eRet == OMX_ErrorNone)
244261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_port_def = *portDefn;
244361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
244461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
244561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoInit:
244661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
244761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PORT_PARAM_TYPE *portParamType =
244861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PORT_PARAM_TYPE *) paramData;
24498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit");
245061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
245261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nSize = sizeof(portParamType);
245361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nPorts           = 2;
245461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nStartPortNumber = 0;
245561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
245661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
245761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat:
245861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
245961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
246061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
24618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat");
246261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
246361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
246461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portFmt->nSize             = sizeof(portFmt);
246561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
246661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (0 == portFmt->nPortIndex) {
246761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (0 == portFmt->nIndex) {
246861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
246961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eCompressionFormat = eCompressionFormat;
247061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
247161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
24728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                " NoMore compression formats");
247361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =  OMX_ErrorNoMore;
247461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
247561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (1 == portFmt->nPortIndex) {
247661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
247761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
247861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (0 == portFmt->nIndex)
247961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
248061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
248161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else if (1 == portFmt->nIndex)
248261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else {
248461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
24858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                " NoMore Color formats");
248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =  OMX_ErrorNoMore;
248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
24888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("returning %d", portFmt->eColorFormat);
248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
24908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("get_parameter: Bad port index %d",
249161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (int)portFmt->nPortIndex);
249261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
249361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
249461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
249561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
249661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Component should support this port definition*/
249761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamAudioInit:
249861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
249961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PORT_PARAM_TYPE *audioPortParamType =
250061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PORT_PARAM_TYPE *) paramData;
25018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit");
250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nSize = sizeof(audioPortParamType);
250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nPorts           = 0;
250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nStartPortNumber = 0;
250661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
250861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Component should support this port definition*/
250961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamImageInit:
251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
251161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PORT_PARAM_TYPE *imagePortParamType =
251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PORT_PARAM_TYPE *) paramData;
25138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit");
251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nSize = sizeof(imagePortParamType);
251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nPorts           = 0;
251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nStartPortNumber = 0;
251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
2519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Component should support this port definition*/
252261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamOtherInit:
252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
25248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x",
252561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet =OMX_ErrorUnsupportedIndex;
252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
252961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamStandardComponentRole:
253061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
253161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_COMPONENTROLETYPE *comp_role;
253261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
253361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
253461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role->nSize = sizeof(*comp_role);
253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
25368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d",
253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
253861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
253961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_MAX_STRINGNAME_SIZE);
254061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
254261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Added for parameter test */
254361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPriorityMgmt:
254461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PRIORITYMGMTTYPE *priorityMgmType =
254761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PRIORITYMGMTTYPE *) paramData;
25488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt");
254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                priorityMgmType->nSize = sizeof(priorityMgmType);
2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
255461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Added for parameter test */
255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamCompBufferSupplier:
255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
255761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
25598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier");
256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufferSupplierType->nSize = sizeof(bufferSupplierType);
256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (0 == bufferSupplierType->nPortIndex)
256461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
256561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else if (1 == bufferSupplierType->nPortIndex)
256661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
256761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else
256861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
256961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
257061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
257161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
257261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
257361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc:
257461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
25758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x",
2576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263:
258061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
25818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x",
2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
258561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4:
258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
25878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x",
258861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
259161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg2:
259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
25938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x",
2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
259561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
259661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
259761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoProfileLevelQuerySupported:
259861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
25998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex);
260061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
260161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
260261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = get_supported_profile_level_for_1080p(profileLevelType);
260361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
260461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
260561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
260661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
260761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage");
260961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
261061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
261161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
261261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (secure_mode) {
261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
261461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                GRALLOC_USAGE_PRIVATE_UNCACHED);
261561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
261661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_
261761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
261861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else
2619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_UNCACHED;
262061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
26218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("nativeBuffersUsage->nUsage %x", (unsigned int)nativeBuffersUsage->nUsage);
262261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
26248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!");
262561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadParameter;
262661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
262761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
262961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
263161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex);
263461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet =OMX_ErrorUnsupportedIndex;
263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
2636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
26398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)",
264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.frame_width,
264161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.frame_height,
264261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.stride,
264361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.scan_lines);
2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
264561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
2650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
2652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
2654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
265561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((params == NULL) ||
265661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (params->nativeBuffer == NULL) ||
265761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (params->nativeBuffer->handle == NULL) ||
265861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            !m_enable_android_native_buffers)
2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_use_android_native_buffers = OMX_TRUE;
2661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
2662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    private_handle_t *handle = (private_handle_t *)nBuf->handle;
266361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
2664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_U8 *buffer = NULL;
266561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
266661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer = (OMX_U8*)mmap(0, handle->size,
2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
266861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer == MAP_FAILED) {
266961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
267061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
2676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
2678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
268161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
268261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::Setparameter
2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
268461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
268561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Set Parameter method implementation.
2686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
268761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
268861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
2689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
269061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
269161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
2692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
269361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
269561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE paramIndex,
269661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR        paramData)
2697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
26996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    int ret=0;
27006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    struct v4l2_format fmt;
270161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
27028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Set Param in Invalid State");
2703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
270561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (paramData == NULL) {
27068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Param in Invalid paramData");
270761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
2708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
270961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((m_state != OMX_StateLoaded) &&
271061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_out_bEnabled == OMX_TRUE) &&
271261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
271361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_inp_bEnabled == OMX_TRUE)) {
27148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Set Param in Invalid State");
2715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
2716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
271761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)paramIndex) {
271861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition:
2719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
272061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
272161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
272261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
272361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //been called.
27248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
272561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (int)portDefn->format.video.nFrameHeight,
272661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (int)portDefn->format.video.nFrameWidth);
272761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (OMX_DirOutput == portDefn->eDir) {
27288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
272961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_display_id = portDefn->format.video.pNativeWindow;
273061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    unsigned int buffer_size;
273161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!client_buffers.get_buffer_req(buffer_size)) {
27328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Error in getting buffer requirements");
273361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorBadParameter;
273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
273561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
273661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->nBufferSize >=  drv_ctx.op_buf.buffer_size ) {
273761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
273861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
273961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = set_buffer_req(&drv_ctx.op_buf);
274061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (eRet == OMX_ErrorNone)
274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                m_port_def = *portDefn;
274261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
27438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)",
274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
274561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    portDefn->nBufferCountActual, portDefn->nBufferSize);
274661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorBadParameter;
274761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
274861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
274961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (OMX_DirInput == portDefn->eDir) {
275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((portDefn->format.video.xFramerate >> 16) > 0 &&
275161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        // Frame rate only should be set if this is a "known value" or to
275361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        // activate ts prediction logic (arbitrary mode only) sending input
275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        // timestamps with max value (LLONG_MAX).
275561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu",
275661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.xFramerate >> 16);
275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.frame_rate.fps_denominator);
275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!drv_ctx.frame_rate.fps_numerator) {
276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
276161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator = 30;
276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (drv_ctx.frame_rate.fps_denominator)
276461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator = (int)
276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
276661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.frame_rate.fps_denominator = 1;
276761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator;
276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                frm_int, drv_ctx.frame_rate.fps_numerator /
277161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (float)drv_ctx.frame_rate.fps_denominator);
277261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
27738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
277461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.video_resolution.frame_height !=
277561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portDefn->format.video.nFrameHeight ||
277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.video_resolution.frame_width  !=
277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portDefn->format.video.nFrameWidth) {
27788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("SetParam IP: WxH(%d x %d)",
277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.nFrameWidth,
278061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.nFrameHeight);
278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (portDefn->format.video.nFrameHeight != 0x0 &&
278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.nFrameWidth != 0x0) {
278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            update_resolution(portDefn->format.video.nFrameWidth,
278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    portDefn->format.video.nFrameHeight);
278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
278661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.fmt.pix_mp.pixelformat = output_capability;
27898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (ret) {
27928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("Set Resolution failed");
279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                eRet = OMX_ErrorUnsupportedSetting;
279461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else
279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                eRet = get_buffer_req(&drv_ctx.op_buf);
279661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
279761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
279961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
280161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (~(buffer_prop->alignment - 1));
280361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = set_buffer_req(buffer_prop);
280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
28058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)",
280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->nBufferCountActual, portDefn->nBufferSize);
280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorBadParameter;
280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
281061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portDefn->eDir ==  OMX_DirMax) {
281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
281261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (int)portDefn->nPortIndex);
281361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
2815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
281661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
281761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat:
2818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
281961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
282161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int ret=0;
282261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_format fmt;
28238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d",
282461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat);
282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
282661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (1 == portFmt->nPortIndex) {
282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
282861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.pixelformat = capture_capability;
283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    enum vdec_output_fromat op_format;
283261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) ||
283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar))
283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
283661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else if (portFmt->eColorFormat ==
283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (OMX_COLOR_FORMATTYPE)
283861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
283961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        op_format = VDEC_YUV_FORMAT_TILE_4x2;
284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else
284161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorBadParameter;
284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (eRet == OMX_ErrorNone) {
284461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.output_format = op_format;
284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
284661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ret) {
28478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("Set output format failed");
284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorUnsupportedSetting;
284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            /*TODO: How to handle this case */
285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = get_buffer_req(&drv_ctx.op_buf);
285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (eRet == OMX_ErrorNone) {
285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
28568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("Set color format failed");
285761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorBadParameter;
285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
2861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
286461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexPortDefn:
2865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
286661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
286761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
28688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d",
286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->nFramePackingFormat);
287061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
287161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Input port */
287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (portFmt->nPortIndex == 0) {
287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (secure_mode) {
287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            arbitrary_bytes = false;
287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
287761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorUnsupportedSetting;
287861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
287961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            arbitrary_bytes = true;
288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (portFmt->nFramePackingFormat ==
288261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        arbitrary_bytes = false;
288461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
28858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu",
288661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portFmt->nFramePackingFormat);
288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
288861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
288961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
28908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port");
289161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
289461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_out_mem_region_smi = OMX_TRUE;
289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
28968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set");
289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_use_output_pmem = OMX_TRUE;
289861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
2901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamStandardComponentRole:
29056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            {
290661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_COMPONENTROLETYPE *comp_role;
290761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
29088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        comp_role->cRole);
291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
291161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ((m_state == OMX_StateLoaded)&&
291261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
291361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("Set Parameter called in valid state");
291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
29158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorIncorrectStateOperation;
291761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
291961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
292261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
292461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
292561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
292661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
292761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((char*)comp_role->cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
292861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
292961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
293161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
293661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
293861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
293961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
294361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
294561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
294661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
294761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
294861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
294961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
295061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
295261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
295361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
295461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
295561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
295661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ) {
295761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) {
295861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
295961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
296161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
296261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
296361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
296461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
296561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ) {
296661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) {
296761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
297261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
297461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE))) {
297561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
29818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind);
298261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorInvalidComponentName;
298361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
29856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPriorityMgmt:
2988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state != OMX_StateLoaded) {
29908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
299161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorIncorrectStateOperation;
299261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
29948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d",
299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        priorityMgmtype->nGroupID);
2996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
29978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d",
299861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        priorityMgmtype->nGroupPriority);
2999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
300061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
3002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
300461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
300661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamCompBufferSupplier:
30076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            {
300861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
30098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
301061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufferSupplierType->eBufferSupplier);
301161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
301361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
301461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else
301561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
301661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
301761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
301861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
301961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
30206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
302161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc:
302261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
30238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d",
302461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
302561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
302661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263:
302861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
30298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d",
303061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
303261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4:
303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
30358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d",
303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
303961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg2:
304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
30418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d",
304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
304361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
304461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoDecoderPictureOrder:
304661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control control;
305061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int pic_order,rc=0;
30518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d",
305261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pictureOrder->eOutputPictureOrder);
305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
305661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    time_stamp_dts.set_timestamp_reorder_mode(false);
305861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadParameter;
306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (eRet == OMX_ErrorNone) {
306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
306261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.value = pic_order;
306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
306461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (rc) {
30658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Set picture order failed");
306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
306761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
306961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamConcealMBMapExtraData:
307261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode)
307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
307461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else {
30768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("secure mode setting not supported");
307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
307861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
307961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
308061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamFrameInfoExtraData:
308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode)
308361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            ((QOMX_ENABLETYPE *)paramData)->bEnable);
308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else {
30868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("secure mode setting not supported");
308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
308861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
308961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamInterlaceExtraData:
309261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode)
309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
309461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
309561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else {
30968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("secure mode setting not supported");
309761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
309961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
310061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamH264TimeInfo:
310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode)
310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else {
31058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("secure mode setting not supported");
310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
310761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
310961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoDivx:
311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexPlatformPvt:
311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
31168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port");
311761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
311861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
311961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
312261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_pvt_entry_pmem = OMX_TRUE;
312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
31248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set");
312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_use_output_pmem = OMX_TRUE;
312661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
312761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
312861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
312961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
313061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
313161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
313261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
313361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
313461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
313561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control control;
313661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int rc;
313761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.idr_only_decoding = 1;
313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
313961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
314061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
314161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc) {
31428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Set picture order failed");
314361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
314461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
314561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
314661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
314761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
314861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (rc) {
31498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Sync frame setting failed");
315061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
315161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
315261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
315361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
315461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
3155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
315661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamIndexExtraDataType:
315761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
315861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
315961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
316061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
316161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (extradataIndexType->bEnabled == OMX_TRUE) &&
316261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (extradataIndexType->nPortIndex == 1)) {
31638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
316461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
316561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
316661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
316761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
316861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
316961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
317061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamEnableSmoothStreaming:
3171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
317261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control control;
317361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_format fmt;
317461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
317561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.value = 1;
317661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
317761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc < 0) {
317861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
317961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorHardware;
318061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
318161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
318261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
3183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
318461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Need to allow following two set_parameters even in Idle
318561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             * state. This is ANDROID architecture which is not in sync
318661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             * with openmax standard. */
318761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
318861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
318961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
319061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (enableNativeBuffers) {
319161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_enable_android_native_buffers = enableNativeBuffers->enable;
319261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
319361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
319461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
319561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
319661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
319761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = use_android_native_buffer(hComp, paramData);
319861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
319961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
3200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
320161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamEnableTimeStampReorder:
320261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
320361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
320461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
320561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (reorder->bEnable == OMX_TRUE) {
320661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frm_int =0;
320761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        time_stamp_dts.set_timestamp_reorder_mode(true);
320861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else
320961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        time_stamp_dts.set_timestamp_reorder_mode(false);
321061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
321161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    time_stamp_dts.set_timestamp_reorder_mode(false);
321261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (reorder->bEnable == OMX_TRUE) {
321361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
321461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
321561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
321661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
321761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
321861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
321961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
32208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex);
322161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedIndex;
322261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
322361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
322461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
322861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
322961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetConfig
3230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
323161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
323261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Get Config Method implementation.
3233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
323461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
323561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
323761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
323861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
3239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
324061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
324261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE configIndex,
324361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_PTR     configData)
3244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
324561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
3246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
324761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
32488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Config in Invalid State");
324961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
325061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
325161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
325261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)configIndex) {
325361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexConfigInterlaced:
325461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
325561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
325661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
325761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (configFmt->nPortIndex == 1) {
325861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (configFmt->nIndex == 0) {
325961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
326061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (configFmt->nIndex == 1) {
326161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        configFmt->eInterlaceType =
326261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
326361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (configFmt->nIndex == 2) {
326461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        configFmt->eInterlaceType =
326561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
326661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
326761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
32688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                " NoMore Interlaced formats");
326961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorNoMore;
327061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
327161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
327261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
32738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port",
327461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (int)configFmt->nPortIndex);
327561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
327661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
327761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
327861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
327961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexQueryNumberOfVideoDecInstance:
328061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
328161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
328261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
328361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                decoderinstances->nNumOfInstances = 16;
328461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*TODO: How to handle this case */
328561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
328661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
328761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexConfigVideoFramePackingArrangement:
328861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
328961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
329061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
329161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
329261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->get_frame_pack_data(configFmt);
329361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
329461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
329561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
329661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
329761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
329861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigCommonOutputCrop:
329961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
330061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
330161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
330261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
330361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
330461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
330561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
33068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex);
330761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
330861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
330961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
331061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
331161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
331261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
331661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
331761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SetConfig
3318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
331961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
332061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Set Config method implementation
3321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
332261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
332361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
332561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
332661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
332761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
332961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE configIndex,
333061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR        configData)
3331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
333261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
33338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Config in Invalid State");
333461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
333561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
333661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
333761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
333861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_VIDEO_CONFIG_NALSIZE *pNal;
333961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
33408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Set Config Called");
334161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
334261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateExecuting) {
33438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("set_config:Ignore in Exe state");
334461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
334561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
334661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
334761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData) {
334861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
33498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData called");
335061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) {
33518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData AVC");
335261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U32 extra_size;
335361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Parsing done here for the AVC atom is definitely not generic
335461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Currently this piece of code is working, but certainly
335561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // not tested with all .mp4 files.
335661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Incase of failure, we might need to revisit this
335761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // for a generic piece of code.
335861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
335961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Retrieve size of NAL length field
336061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // byte #4 contains the size of NAL lenght field
336161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_length = (config->pData[4] & 0x03) + 1;
336261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
336361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_size = 0;
336461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (nal_length > 2) {
336561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
336661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                extra_size = (nal_length - 2) * 2;
336761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
336861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
336961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // SPS starts from byte #6
337061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
337161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U8 *pDestBuf;
3372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
337361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
337461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // minus 6 --> SPS starts from byte #6
337561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // minus 1 --> picture param set byte to be ignored from avcatom
337661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
337761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
337861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U32 len;
337961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U8 index = 0;
338061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // case where SPS+PPS is sent as part of set_config
338161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pDestBuf = m_vendor_config.pData;
338261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
33838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]",
338461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_vendor_config.nPortIndex,
338561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_vendor_config.nDataSize,
338661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_vendor_config.pData);
338761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (index < 2) {
338861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                uint8 *psize;
338961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len = *pSrcBuf;
339061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len = len << 8;
339161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len |= *(pSrcBuf + 1);
339261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psize = (uint8 *) & len;
339361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
339461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                for (unsigned int i = 0; i < nal_length; i++) {
339561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pDestBuf[i] = psize[nal_length - 1 - i];
339661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
339761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //memcpy(pDestBuf,pSrcBuf,(len+2));
339861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pDestBuf += len + nal_length;
339961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pSrcBuf += len + 2;
340061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index++;
340161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pSrcBuf++;   // skip picture param set
340261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len = 0;
340361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
340461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
340561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) {
3406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
3407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nDataSize = config->nDataSize;
340861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
340961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
341061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) {
341161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_vendor_config.pData) {
341261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_vendor_config.pData);
341361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData = NULL;
341461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize = 0;
341561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
341661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
341761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (((*((OMX_U32 *) config->pData)) &
341861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        VC1_SP_MP_START_CODE_MASK) ==
341961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    VC1_SP_MP_START_CODE) {
34208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_config - VC1 simple/main profile");
342161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nPortIndex = config->nPortIndex;
342261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize = config->nDataSize;
342361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData =
342461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_U8 *) malloc(config->nDataSize);
342561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(m_vendor_config.pData, config->pData,
342661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        config->nDataSize);
342761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vc1_profile = VC1_SP_MP_RCV;
342861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) {
34298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_config - VC1 Advance profile");
343061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nPortIndex = config->nPortIndex;
343161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize = config->nDataSize;
343261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData =
343361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_U8 *) malloc((config->nDataSize));
343461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(m_vendor_config.pData, config->pData,
343561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        config->nDataSize);
343661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vc1_profile = VC1_AP;
343761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) {
34388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only");
343961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nPortIndex = config->nPortIndex;
344061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize  = config->nDataSize;
344161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
344261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
344361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vc1_profile = VC1_SP_MP_RCV;
344461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
34458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile");
344661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
344861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
344961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (configIndex == OMX_IndexConfigVideoNalSize) {
345061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
345161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
345261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_length = pNal->nNaluBytes;
345361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
34548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
345561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
3456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
345861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
3459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
346261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
346361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetExtensionIndex
3464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
346561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
346661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX GetExtensionIndex method implementaion.  <TBD>
3467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
346861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
346961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
347161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
347261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
3473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
347461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
347661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_STRING      paramName,
347761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_INDEXTYPE* indexType)
3478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
347961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
34808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State");
3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
348261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
3483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
348461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) {
3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
348861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
3489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
349061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
3491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
349261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
34938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extension: %s is supported", paramName);
3494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
349561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
3497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
349961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
35008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName);
3501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorNotImplemented;
3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
350761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
350861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetState
3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
351061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
351161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns the state information back to the caller.<TBD>
3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
351361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
351461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
351661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
351761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Error None if everything is successful.
351861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
352061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_STATETYPE* state)
3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
352261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *state = m_state;
35238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_state: Returning the state %d",*state);
352461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
352861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
352961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentTunnelRequest
3530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
353161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
353261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Component Tunnel Request method implementation. <TBD>
3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
353461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
353561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
353761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
353861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
3539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
354061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
354261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
354361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE        peerComponent,
354461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                    peerPort,
354561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
3546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
35478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented");
354861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
3549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
355261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
355361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseOutputBuffer
3554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
355561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
355661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper function for Use buffer in the input pin
3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
355861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
355961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
3560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
356161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
356261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
3563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
356461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
35656eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_extradata()
35666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
35676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
356861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.extradata_info.buffer_size) {
356961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
357061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
357161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
357261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.extradata_info.ion);
357361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
357461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
35758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("allocate extradata memory size %d", drv_ctx.extradata_info.size);
357661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
357761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.size, 4096,
357861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.extradata_info.ion.ion_alloc_data,
357961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.extradata_info.ion.fd_ion_data, 0);
358061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
35818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to alloc extradata memory");
358261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
358361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
358461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
358561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.size,
358661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                PROT_READ|PROT_WRITE, MAP_SHARED,
358761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
358861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
35898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to map extradata memory");
359061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
359161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.extradata_info.ion);
359261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
359361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
359461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(drv_ctx.extradata_info.uaddr, 0, drv_ctx.extradata_info.size);
359561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
35966eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
359761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
35986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
35996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
360061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_extradata()
360161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
36026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
360361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.extradata_info.uaddr) {
360461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
360561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
360661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_ion_memory(&drv_ctx.extradata_info.ion);
360761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
360861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
36096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
36106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
36116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
3612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_output_buffer(
361361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
361461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
361561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
361661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
361761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
361861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
3619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
362061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
362161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
362261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned                         i= 0; // Temporary counter
362361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
362461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_PTR privateAppData = NULL;
362561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    private_handle_t *handle = NULL;
362661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *buff = buffer;
362761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
362861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
362961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
36306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
363161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
363261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
363361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_output_headers();
363461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet == OMX_ErrorNone)
363561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_extradata();
363661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
363761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
363861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
363961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
364061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_out_bm_count,i)) {
364161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
364261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
36436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
364461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
364561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
364661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i >= drv_ctx.op_buf.actualcount) {
36478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount);
364861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
364961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
36506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
365161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
365261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
365361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
365461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_use_android_native_buffers) {
365561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
365661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sp<android_native_buffer_t> nBuf = params->nativeBuffer;
365761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                handle = (private_handle_t *)nBuf->handle;
365861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = params->pAppPrivate;
365961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
366061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                handle = (private_handle_t *)buff;
366161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
366261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
366361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
366461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
366561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
366661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        " expected %u, got %lu",
366761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
366861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
366961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
367061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
367161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.op_buf.buffer_size = (OMX_U32)handle->size;
367261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_use_android_native_buffers) {
367361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
367461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buff =  (OMX_U8*)mmap(0, handle->size,
367561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
367661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (buff == MAP_FAILED) {
367761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
367861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
367961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
36806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                }
36816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
36826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#if defined(_ANDROID_ICS_)
368361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            native_buffer[i].nativehandle = handle;
368461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            native_buffer[i].privatehandle = handle;
36856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
368661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!handle) {
368761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
368861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
368961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
369061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
369161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].offset = 0;
369261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
369361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].mmaped_size =
369461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
369561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
3696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
369861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!ouput_egl_buffers && !m_use_output_pmem) {
3699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
37008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("allocate output buffer memory size %d", drv_ctx.op_buf.buffer_size);
370161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
370261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
370361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
370461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
370561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
37068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd);
370761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
370861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
370961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
371061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                      drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
3711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
371261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
371361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                      open (MEM_DEVICE,O_RDWR);
3714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
371561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
37168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
371761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
371861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
372061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
372161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
372261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].pmem_fd = \
372361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                          open (MEM_DEVICE,O_RDWR);
372461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
37258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
372661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
372761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
372861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
373061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
373161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.buffer_size,
373261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.alignment)) {
37338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
373461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
373561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
373661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
373861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
373961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].bufferaddr =
374061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
374161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                PROT_READ|PROT_WRITE, MAP_SHARED,
374261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
374361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
374461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
3745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
374661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
3747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
37488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Unable to mmap output buffer");
374961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
375061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
375161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
375261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = 0;
375361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
375461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
375561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
375661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Use_op_buf: out_pmem=%d",m_use_output_pmem);
375761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!appData || !bytes ) {
375861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!secure_mode && !buffer) {
37598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case");
376061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
376161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
376261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
376361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
376461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
376561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
376661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
376761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!pmem_list->entryList || !pmem_list->entryList->entry ||
376861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !pmem_list->nEntries ||
376961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
37708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Pmem info not valid in use buffer");
377161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
377261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
377361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
377461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_list->entryList->entry;
377561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
377661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_info->pmem_fd);
377761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
377861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
377961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
378061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].mmaped_size =
378161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
378261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
3783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
378461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
378561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
378661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
378761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_out_mem_ptr + i );
378861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
378961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
379061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
379161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
379261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof (vdec_bufferpayload));
379361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
37948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
379561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr,
379661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd );
379761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
379861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = i;
379961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
380061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
380161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].length = drv_ctx.op_buf.buffer_size;
380261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
380361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
380461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
380561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
380661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].data_offset = 0;
380761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
380861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
380961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
381061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
381161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
381261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
381361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
381461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
381561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].data_offset = 0;
381661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
38178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
381861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
3819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
382061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = plane;
382161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = drv_ctx.num_planes;
382261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
38238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
3824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
382561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
38268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to prepare bufs");
382761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
382861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
3829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
383161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
383261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            enum v4l2_buf_type buf_type;
383361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
383461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
383561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
383661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
383761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                streaming[CAPTURE_PORT] = true;
38388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("STREAMON Successful");
383961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
384161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
384261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
384361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
384461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
384561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
384661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
384761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = buff;
384861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
384961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (*bufferHdr)->pAppPrivate = privateAppData;
385061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_out_bm_count,i);
385161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
385261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
385661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
385761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::use_input_heap_buffers
3858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
385961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
386061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use Buffer Heap allocation method implementation.
3861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
386261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
386361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
386561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
386661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None , if everything successful.
3867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
386861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
387061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
387161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
387261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
387361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
387461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
387561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
3876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
38778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer);
387861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
387961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_heap_ptr)
388061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
388161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
388261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.actualcount);
388361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_phdr_pmem_ptr)
388461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
388561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
388661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.actualcount);
388761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
388861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Insufficent memory");
388961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
389061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
389161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input_use_buffer = true;
389261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
389361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
389461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
389561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
389661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
389761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
389861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
389961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
39008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
390161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt],
390261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL, (unsigned)NULL)) {
39038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
390461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
390561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
390661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_in_alloc_cnt++;
390761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
390861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("All i/p buffers have been set!");
390961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
391061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
391161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
391561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
391661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseBuffer
3917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
391861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
391961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use Buffer method implementation.
3920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
392161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
392261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
392461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
392561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None , if everything successful.
3926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
392761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_buffer(
392961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
393061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
393161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
393261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
393361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
393461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
3935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
393661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE error = OMX_ErrorNone;
393761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
393861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
393961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || bytes == 0) {
394061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode && buffer == NULL) {
394161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
394261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
394361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
394461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
394561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
39468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Use Buffer in Invalid State");
394761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
394861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
394961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX)
395061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
395161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
395261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
395361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
39548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
395561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = OMX_ErrorBadPortIndex;
395661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
395761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
395861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (error == OMX_ErrorNone) {
395961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
396061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Send the callback now
396161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
396261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandStateSet,OMX_StateIdle,
396361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
396461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
396561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
396661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
396761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
396861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortEnable,
396961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_INPUT_PORT_INDEX,
397061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
397161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
397261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
397361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
397461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortEnable,
397561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_OUTPUT_PORT_INDEX,
397661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
397761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
397861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
397961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return error;
398061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
3981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
398361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
3984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
398561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
398661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr[bufferindex].pBuffer)
398761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free(m_inp_heap_ptr[bufferindex].pBuffer);
398861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[bufferindex].pBuffer = NULL;
398961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
399061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_bufferHdr)
399161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_input_buffer(pmem_bufferHdr);
399261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
3993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
3996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
399761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
399861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
399961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
400061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
400261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufferHdr - m_inp_mem_ptr;
40038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
400461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
400561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
40068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
400761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) {
400861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_setbuffer_cmd setbuffers;
400961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
401061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
401161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sizeof (vdec_bufferpayload));
40128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("unmap the input buffer fd=%d",
4013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].pmem_fd);
40148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("unmap the input buffer size=%d  address = %d",
4015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].mmaped_size,
4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].bufferaddr);
401761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
401861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_inputbuffer[index].mmaped_size);
401961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
402061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
402161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
402261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_desc_buffer_ptr[index].buf_addr);
402361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_desc_buffer_ptr[index].buf_addr = NULL;
402461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_desc_buffer_ptr[index].desc_data_size = 0;
402561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
402761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
4028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
402961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
403261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
4033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
403761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
4038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
403961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
404061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
404161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
404361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufferHdr - m_out_mem_ptr;
40448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index);
4045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
404661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < drv_ctx.op_buf.actualcount
404761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && drv_ctx.ptr_outputbuffer) {
40488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %x", index,
404961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[index].bufferaddr);
4050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
405161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct vdec_setbuffer_cmd setbuffers;
405261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
405361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
405461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof (vdec_bufferpayload));
4055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
405661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
405761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
405861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
405961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[index].mmaped_size);
406061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
406161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
406261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
4063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
406461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) {
40658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("unmap the output buffer fd = %d",
406661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].pmem_fd);
40678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("unmap the ouput buffer size=%d  address = %d",
406861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
406961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].bufferaddr);
407061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
407161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
407261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
407361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
4074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
407561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
4076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
407761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
407961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
408161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_output_done()) {
408261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_extradata();
408361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
40846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
4085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
408661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
4087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
409161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE **bufferHdr,
409261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32              port,
409361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_PTR              appData,
409461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32              bytes)
4095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
409661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *input = NULL;
409761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char *buf_addr = NULL;
409861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
409961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned   i = 0;
410061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
410161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Sanity Check*/
410261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL) {
410361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
410461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
410561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
410661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_heap_ptr == NULL) {
410761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
410861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                         calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
410961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 drv_ctx.ip_buf.actualcount);
411061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
411161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
411261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  drv_ctx.ip_buf.actualcount);
411361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
411461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr == NULL) {
41158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("m_inp_heap_ptr Allocation failed ");
411661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
411761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
411861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
411961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
412061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Find a Free index*/
412161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
412261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
41238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
412461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
412561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
412661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
412761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
412861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < drv_ctx.ip_buf.actualcount) {
412961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
413061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
413161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buf_addr == NULL) {
413261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
413361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
413461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
413561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_inp_heap_ptr + i);
413661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input = *bufferHdr;
413761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_heap_inp_bm_count,i);
413861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
413961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pBuffer           = (OMX_U8 *)buf_addr;
414061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
414161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nVersion.nVersion = OMX_SPEC_VERSION;
414261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
414361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pAppPrivate       = appData;
414461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
41458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr );
414661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
41478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
414861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Add the Buffers to freeq*/
414961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i],
415061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL, (unsigned)NULL)) {
41518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
415261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
415361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
415461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
415561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
415661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
415761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
415861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
416461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
416561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateInputBuffer
4166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
416761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
416861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper function for allocate buffer in the input pin
4169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
417061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
417161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
417361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
417461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
4175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
417661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
417861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
417961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
418061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
418161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
418261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes)
4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
418561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
418661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
418761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *input = NULL;
418861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned   i = 0;
418961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char *buf_addr = NULL;
419061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int pmem_fd = -1;
4191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bytes != drv_ctx.ip_buf.buffer_size) {
41938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Requested Size is wrong %d epected is %d",
419461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bytes, drv_ctx.ip_buf.buffer_size);
419561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
419661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_mem_ptr) {
41998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
420061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.actualcount,
420161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.buffer_size);
4202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
420361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
420461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
4205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
420661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_mem_ptr == NULL) {
420761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
420861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
421061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
421161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
4212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
421361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ptr_inputbuffer == NULL) {
421461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
421561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
421761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
421861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
4219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
422061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ip_buf_ion_info == NULL) {
422161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
422261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
422561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
422661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
4227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
422861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
4229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
423061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
423361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
423461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
42358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
423661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
423761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
424061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < drv_ctx.ip_buf.actualcount) {
424161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_buffer buf;
424261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_plane plane;
424361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc;
42446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
4245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
42468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate input Buffer size %d", drv_ctx.ip_buf.buffer_size);
424761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
424861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
424961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
425061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
425161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
425261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
425361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
425461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
4255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
425661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = open (MEM_DEVICE,O_RDWR);
4257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
425861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd < 0) {
42598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
426061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
426161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
426361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd == 0) {
426461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_fd = open (MEM_DEVICE,O_RDWR);
4265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
426661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_fd < 0) {
42678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
426861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
426961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
427061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
427261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
427361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.alignment)) {
42748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
427561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(pmem_fd);
427661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
427761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
427961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
428061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_addr = (unsigned char *)mmap(NULL,
428161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.buffer_size,
428261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
4283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
428461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buf_addr == MAP_FAILED) {
428561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(pmem_fd);
4286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
428761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
4288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
42898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Map Failed to allocate input buffer");
429061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
429161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
429261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
429361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_inp_mem_ptr + i);
429461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
429561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
429661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
429761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
429861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
429961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
430061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
430161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].offset = 0;
430261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
430361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
430461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = i;
430561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
430661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
430761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.bytesused = 0;
430861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
430961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
431061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
431161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.reserved[1] = 0;
431261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
431361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = &plane;
431461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = 1;
431561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
43168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]);
431761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
431861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
431961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
432061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
43218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to prepare bufs");
432261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
432361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
4324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
432661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input = *bufferHdr;
432761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_inp_bm_count,i);
43288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr);
432961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
433061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
433161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
433261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input->pBuffer           = (OMX_U8 *)buf_addr;
433361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
433461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nVersion.nVersion = OMX_SPEC_VERSION;
433561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
433661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pAppPrivate       = appData;
433761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
433861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
433961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
434061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.disable_dmx) {
434161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_desc_buffer(i);
434261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
434361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
43448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found");
434561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
434661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
434761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
435261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
435361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateOutputBuffer
4354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
435561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
435661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper fn for AllocateBuffer in the output pin
4357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
435861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
435961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
4360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
436161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
436261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went well.
4363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
436461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
436661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
436761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
436861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
436961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
437061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes)
4371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
437261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
437361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
437461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned                         i= 0; // Temporary counter
437561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
437661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
4377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
437861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ion_device_fd =-1;
437961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ion_allocation_data ion_alloc_data;
438061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ion_fd_data fd_ion_data;
4381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
438261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
43838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
438461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount,
438561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size);
438661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nBufHdrSize        = 0;
438761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformEntrySize = 0;
438861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformListSize  = 0;
438961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPMEMInfoSize = 0;
439061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int pmem_fd = -1;
439161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned char *pmem_baseaddress = NULL;
439261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
439361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
439461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
439561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
439661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
43978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)",
439861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
439961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufHdrSize        = drv_ctx.op_buf.actualcount *
440061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE);
440161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
440261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
440361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
440461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformListSize  = drv_ctx.op_buf.actualcount *
440561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
440661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
440761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
440861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
44098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
441061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof(OMX_BUFFERHEADERTYPE),
441161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,
441261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPlatformListSize);
44138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize,
441461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
4415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
44168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("allocate outputBuffer size %d",drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount);
441761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_device_fd = alloc_map_ion_memory(
441861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
441961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.alignment,
442061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0);
442161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ion_device_fd < 0) {
442261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
442361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
442461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = fd_ion_data.fd;
4425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
442661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = open (MEM_DEVICE,O_RDWR);
4427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
442861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd < 0) {
44298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
443061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.buffer_size);
443161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
443261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
443461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd == 0) {
443561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_fd = open (MEM_DEVICE,O_RDWR);
4436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
443761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_fd < 0) {
44388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
443961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size);
444061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
444161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
444261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
444461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
444561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.actualcount,
444661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.alignment)) {
44478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
444861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(pmem_fd);
444961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
445061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
445261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
445361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_baseaddress = (unsigned char *)mmap(NULL,
445461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (drv_ctx.op_buf.buffer_size *
445561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     drv_ctx.op_buf.actualcount),
445661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
445761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_baseaddress == MAP_FAILED) {
44588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("MMAP failed for Size %d",
445961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size);
446061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(pmem_fd);
4461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
446261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
4463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
446461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
446561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
446661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
446761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
446861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Alloc mem for platform specific info
446961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *pPtr=NULL;
447061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
447161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,1);
447261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
447361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   calloc (sizeof(struct vdec_bufferpayload),
447461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.op_buf.actualcount);
447561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
447661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 calloc (sizeof (struct vdec_output_frameinfo),
447761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         drv_ctx.op_buf.actualcount);
4478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
447961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
448061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc (sizeof(struct vdec_ion),
448161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          drv_ctx.op_buf.actualcount);
4482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
448461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
448561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && drv_ctx.ptr_respbuffer) {
448661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[0].mmaped_size =
448761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (drv_ctx.op_buf.buffer_size *
448861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 drv_ctx.op_buf.actualcount);
448961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufHdr          =  m_out_mem_ptr;
449061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
449161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
449261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_list)  + nPlatformListSize);
449361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
449461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_entry) + nPlatformEntrySize);
449561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformList   = m_platform_list;
449661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformEntry  = m_platform_entry;
449761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPMEMInfo       = m_pmem_info;
449861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
44998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
450061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
450161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Settting the entire storage nicely
45028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry);
45038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
450461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
450561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
450661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
450761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Set the values when we determine the right HxW param
450861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nAllocLen          = bytes;
450961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nFilledLen         = 0;
451061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pAppPrivate        = appData;
451161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
451261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Platform specific PMEM Information
451361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform Entry
45148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i);
451561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
451661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->entry      = pPMEMInfo;
451761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform List
451861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->nEntries    = 1;
451961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->entryList   = pPlatformEntry;
452061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep pBuffer NULL till vdec is opened
452161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pBuffer            = NULL;
452261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOffset            = 0;
452361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
452461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
452561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->pmem_fd = 0;
452661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pPlatformPrivate = pPlatformList;
452761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
452861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
452961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_pmem_info[i].pmem_fd = pmem_fd;
4530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
453161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
453261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
453361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
4534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
453661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Create a mapping between buffers*/
453761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
453861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer[i].client_data = (void *)\
453961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        &drv_ctx.ptr_outputbuffer[i];
454061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
454161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr =
454261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
454361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
45448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("pmem_fd = %d offset = %d address = %p",
454561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
454661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[i].bufferaddr);
454761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Move the buffer and buffer header pointers
454861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr++;
454961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo++;
455061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry++;
455161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList++;
455261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
455361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
45548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
455561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr, pPtr);
455661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_out_mem_ptr) {
455761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_out_mem_ptr);
455861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr = NULL;
455961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
456061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pPtr) {
456161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(pPtr);
456261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPtr = NULL;
456361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
456461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer) {
456561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_outputbuffer);
456661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer = NULL;
456761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
456861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_respbuffer) {
456961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_respbuffer);
457061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer = NULL;
457161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
457361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.op_buf_ion_info) {
45748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free o/p ion context");
457561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.op_buf_ion_info);
457661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info = NULL;
457761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
457961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet =  OMX_ErrorInsufficientResources;
458061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
458161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet == OMX_ErrorNone)
458261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_extradata();
458361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
458461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
458561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
458661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
45878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i);
458861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
458961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
459261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
459361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i < drv_ctx.op_buf.actualcount) {
459461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct v4l2_buffer buf;
459561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct v4l2_plane plane[VIDEO_MAX_PLANES];
459661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int rc;
459761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
459861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
459961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].buffer_len =
460061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size;
460161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
460261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *bufferHdr = (m_out_mem_ptr + i );
460361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (secure_mode) {
460461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
460561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
460661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
460761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
460861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.index = i;
460961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
461061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.memory = V4L2_MEMORY_USERPTR;
461161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].length = drv_ctx.op_buf.buffer_size;
461261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
461361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
46146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
461561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
46166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
461761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
461861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].data_offset = 0;
461961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
462061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
462161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
462261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
4623b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#ifdef USE_ION
462461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
4625b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#endif
462661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
462761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].data_offset = 0;
462861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (extra_idx >= VIDEO_MAX_PLANES) {
46298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx);
463061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
463161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
463261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.m.planes = plane;
463361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.length = drv_ctx.num_planes;
46348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
463561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
463661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc) {
463761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*TODO: How to handle this case */
463861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
463961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
464061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
464161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
464261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                enum v4l2_buf_type buf_type;
464361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
464461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
464561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc) {
464661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
464761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
464861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    streaming[CAPTURE_PORT] = true;
46498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("STREAMON Successful");
465061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
465161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
465261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
465361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
465461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pAppPrivate = appData;
465561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_out_bm_count,i);
465661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
46578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient");
465861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
465961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
466261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer  -- API Call
4667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
466861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
466961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateBuffer
4670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
467161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
467261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
4673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
467461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
467561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
467761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
467861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
4679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
468061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
468261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
468361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
468461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                     appData,
468561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                       bytes)
4686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned i = 0;
4688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
4689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
46908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port);
469161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
46928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State");
4693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
4694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
469661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
469761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (arbitrary_bytes) {
469861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
469961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
470061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
470161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
470261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
47036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
47046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                appData,bytes);
470561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
47068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
470761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
4708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
471061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
471161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (allocate_done()) {
471261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
4713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
4714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
4715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandStateSet,OMX_StateIdle,
471661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
4717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
471961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
472061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
472161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
472261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,
4723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_CORE_INPUT_PORT_INDEX,
4724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
472561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
472761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
472861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
472961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
4730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandPortEnable,
473161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_CORE_OUTPUT_PORT_INDEX,
473261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
4733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
47368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet);
4737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
4738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call
4741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
474261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
474361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::FreeBuffer
4744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
474561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
4746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
474761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
474861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
475061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
475161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
4752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
475361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
475561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                 port,
475661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
4757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
4759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int nPortIndex;
47608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("In for decoder free_buffer");
4761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
476261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateIdle &&
476361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
47648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending");
476561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
476661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
47678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Buffer while port %d disabled", port);
476861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
476961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
477061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (port == OMX_CORE_OUTPUT_PORT_INDEX &&
477161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) {
47728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Buffer while port %d enable pending", port);
477361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
47748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled");
4775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
477661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ErrorPortUnpopulated,
477761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
4778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
478061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_state != OMX_StateInvalid) {
47818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers");
4782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
478361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ErrorPortUnpopulated,
478461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
4785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
478761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
478861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if arbitrary bytes*/
478961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!arbitrary_bytes && !input_use_buffer)
479061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPortIndex = buffer - m_inp_mem_ptr;
479161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
479261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPortIndex = buffer - m_inp_heap_ptr;
4793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
47948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex);
479561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nPortIndex < drv_ctx.ip_buf.actualcount) {
479661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Clear the bit associated with it.
479761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
479861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
479961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (input_use_buffer == true) {
480061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
48018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex);
480261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_phdr_pmem_ptr)
480361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
480461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
480561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (arbitrary_bytes) {
480661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_phdr_pmem_ptr)
480761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
480861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else
480961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_input_buffer(nPortIndex,NULL);
481061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
481161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    free_input_buffer(buffer);
4812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
481361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bPopulated = OMX_FALSE;
481461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Free the Buffer Header*/
481561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (release_input_done()) {
48168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("ALL input buffers are freed/released");
481761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer_header();
481861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
481961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
48208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid");
4821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
4822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
482461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
482561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && release_input_done()) {
48268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
4827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
4828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandPortDisable,
482961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_INPUT_PORT_INDEX,
483061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
4831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
483261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // check if the buffer is valid
48346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        nPortIndex = buffer - client_buffers.get_il_buf_hdr();
483561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nPortIndex < drv_ctx.op_buf.actualcount) {
48368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex);
4837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Clear the bit associated with it.
4838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
4839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_out_bPopulated = OMX_FALSE;
48406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            client_buffers.free_output_buffer (buffer);
4841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
484261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (release_output_done()) {
484361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_output_buffer_header();
4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
484561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
48468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid");
4847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
4848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
484961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
485061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && release_output_done()) {
48518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it");
4852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
485461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
48556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_
485661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_enable_android_native_buffers) {
485761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
485861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
485961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
48606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
4861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
486261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortDisable,
486361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_OUTPUT_PORT_INDEX,
486461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
4865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
486661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
4867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadPortIndex;
4868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
486961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((eRet == OMX_ErrorNone) &&
487061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
487161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_done()) {
4872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Send the callback now
4873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
4874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandStateSet, OMX_StateLoaded,
487561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
4876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
4879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
488361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
488461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::EmptyThisBuffer
4885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
488661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
488761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   This routine is used to push the encoded video frames to
488861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   the video decoder.
4889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
489061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
489161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
489361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
489461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went successful.
4895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
489661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
489861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
4899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
490061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
490161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
4902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
49038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
49048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        codec_config_flag = true;
49058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
49068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
490761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
49088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Empty this buffer in Invalid State");
490961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
491061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
491261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
49138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL");
491461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
491561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
491761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_bEnabled) {
49188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled.");
491961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
492061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
492261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
49238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %lu", buffer->nInputPortIndex);
492461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
492561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
492761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
492861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!latency) {
492961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec_time.stop();
493061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            latency = dec_time.processing_time_us();
493161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec_time.start();
493261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
493361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
493461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
493561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
493661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufferIndex = buffer - m_inp_heap_ptr;
493761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
493861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (input_use_buffer == true) {
493961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nBufferIndex = buffer - m_inp_heap_ptr;
494061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
494161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
494261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
494361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer = &m_inp_mem_ptr[nBufferIndex];
494461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
494561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
494661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
494761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nBufferIndex = buffer - m_inp_mem_ptr;
494861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
494961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
495061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
495161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nBufferIndex > drv_ctx.ip_buf.actualcount ) {
49528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid");
495361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
495461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
495561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
495661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
495761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
495861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
495961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned)hComp,(unsigned)buffer,
496061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
496161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
496261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
496361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            set_frame_rate(buffer->nTimeStamp);
496461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
496561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
496761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
496861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
496961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/* ======================================================================
497061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
497161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::empty_this_buffer_proxy
497261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
497361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
497461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   This routine is used to push the encoded video frames to
497561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   the video decoder.
497661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
497761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
497861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
497961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
498061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
498161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went successful.
498261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
498361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
498461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
498561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
498661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
498761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int push_cnt = 0,i=0;
498861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned nPortIndex = 0;
498961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
499061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_input_frameinfo frameinfo;
499161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_bufferpayload *temp_buffer;
499261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_seqheader seq_header;
499361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool port_setting_changed = true;
499461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool not_coded_vop = false;
499561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
499661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Should we generate a Aync error event*/
499761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
49988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid");
499961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
500061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
500161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
500261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
500361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
500461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nPortIndex > drv_ctx.ip_buf.actualcount) {
50058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
500661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPortIndex);
500761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
500861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
500961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
501061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_input_buffers++;
501161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
501261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return zero length and not an EOS buffer */
501361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
501461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
50158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("return zero legth buffer");
501661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
501761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EBD);
501861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
501961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
502261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX) {
502361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        mp4StreamType psBits;
502461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
502561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psBits.numBytes = buffer->nFilledLen;
502661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        mp4_headerparser.parseHeader(&psBits);
502761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        not_coded_vop = mp4_headerparser.is_notcodec_vop(
502861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
502961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (not_coded_vop) {
50308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Found Not coded vop len %lu frame number %u",
503161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buffer->nFilledLen,frame_count);
503261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
50338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Eos and Not coded Vop set len to zero");
503461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                not_coded_vop = false;
503561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer->nFilledLen = 0;
503661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
5037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
504061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (input_flush_progress == true
5041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
504261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            || not_coded_vop
5043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
504461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan       ) {
50458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Flush in progress return buffer ");
504661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
504761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EBD);
504861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
504961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
505061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
505161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
505261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
505361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) {
505461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
505561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
505661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
50578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
505861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*for use buffer we need to memcpy the data*/
505961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp_buffer->buffer_len = buffer->nFilledLen;
506061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
506161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (input_use_buffer) {
506261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFilledLen <= temp_buffer->buffer_len) {
506361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (arbitrary_bytes) {
506461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
506561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
506661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
506761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nFilledLen);
506861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
506961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
507061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
507161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
507261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
507361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
507461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
507561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.bufferaddr = temp_buffer->bufferaddr;
507661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.client_data = (void *) buffer;
507761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.datalen = temp_buffer->buffer_len;
507861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.flags = 0;
507961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.offset = buffer->nOffset;
508061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.pmem_fd = temp_buffer->pmem_fd;
508161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.pmem_offset = temp_buffer->offset;
508261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.timestamp = buffer->nTimeStamp;
508361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
508461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("ETB: dmx enabled");
508561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_demux_entries == 0) {
508661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extract_demux_addr_offsets(buffer);
508761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
508861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
508961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
509061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        handle_demux_data(buffer);
509161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
509261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
509361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
509461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_addr = NULL;
509561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_size = 0;
509661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
509761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes) {
509861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= buffer->nFlags;
5099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
510261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
510361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (arbitrary_bytes) {
51048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
510561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_timestamp_list.insert_ts(buffer->nTimeStamp);
510661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
51078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
510861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_timestamp_list.insert_ts(buffer->nTimeStamp);
510961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
511061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
511461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (inputBufferFile1) {
511561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fwrite((const char *)temp_buffer->bufferaddr,
511661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                temp_buffer->buffer_len,1,inputBufferFile1);
511761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
512061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
512161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
512261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
512361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
512461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
512561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
51268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached");
512761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
512861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_scratch.nFilledLen = 0;
512961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_count = 0;
513061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
513161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_count = 0;
513261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils)
513361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils->initialize_frame_checking_environment();
513461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.flush();
513561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_ts = LLONG_MAX;
513661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_flags = 0;
513761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
513861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_entries = 0;
513961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
514061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
514161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane;
514261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&buf, 0, sizeof(buf));
514361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&plane, 0, sizeof(plane));
514461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
514561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long  print_count;
514661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
51478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.flags = V4L2_QCOM_BUF_FLAG_EOS;
51488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("INPUT EOS reached") ;
514961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
515061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
515161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = nPortIndex;
515261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
515361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
515461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.bytesused = temp_buffer->buffer_len;
515561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.length = drv_ctx.ip_buf.buffer_size;
515661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
515761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)temp_buffer->offset;
515861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[0] = temp_buffer->pmem_fd;
515961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[1] = temp_buffer->offset;
516061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.data_offset = 0;
516161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = &plane;
516261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = 1;
516361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (frameinfo.timestamp >= LLONG_MAX) {
516461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
516561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
516661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //assumption is that timestamp is in milliseconds
516761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
516861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
516961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
517061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
517161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
517261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
51738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver");
517461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorHardware;
517561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
51768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    codec_config_flag = false;
51778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("%s: codec_config cleared", __FUNCTION__);
51788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
517961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!streaming[OUTPUT_PORT]) {
518061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enum v4l2_buf_type buf_type;
518161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int ret,r;
518261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
518361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
51848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
518561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
518661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!ret) {
51878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful");
518861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            streaming[OUTPUT_PORT] = true;
518961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
519061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
51918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT");
519261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
519361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
519461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EBD);
519561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
519661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
519761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
519861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
519961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
520061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    time_stamp_dts.insert_timestamp(buffer);
5201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
520261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
5203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
520661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
520761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::FillThisBuffer
5208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
520961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
521061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL client uses this method to release the frame buffer
521161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   after displaying them.
5212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
521361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
521461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
521661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
521761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
521961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
522161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5223f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    unsigned nPortIndex = buffer - client_buffers.get_il_buf_hdr();
5224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
522561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
52268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("FTB in Invalid State");
522761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
522861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
522961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
523061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_bEnabled) {
52318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled.");
523261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
523361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
523461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
523561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL ||
5236f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            (nPortIndex >= drv_ctx.op_buf.actualcount)) {
5237f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index,  nPortIndex %u bufCount %u",
5238f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            nPortIndex, drv_ctx.op_buf.actualcount);
523961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
524061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
524161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
524261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
52438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex);
524461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
524561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
524661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
524761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
524861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg);
524961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
525261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
525361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::fill_this_buffer_proxy
5254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
525561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
525661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL client uses this method to release the frame buffer
525761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   after displaying them.
5258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
525961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
526061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
526261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
526361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
526561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
526761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE        hComp,
526861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
5269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
527061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE nRet = OMX_ErrorNone;
527161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
527261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned nPortIndex = 0;
527361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_fillbuffer_cmd fillbuffer;
527461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
527561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
527661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
527761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
527861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
5279f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) {
5280f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u",
5281f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            nPortIndex, drv_ctx.op_buf.actualcount);
528261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
5283f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
528461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
52858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
528661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufferAdd, bufferAdd->pBuffer);
528761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Return back the output buffer to client*/
528861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) {
52898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Output Buffers return flush/disable condition");
529061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
529161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.FillBufferDone (hComp,m_app_data,buffer);
529261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
529361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
529461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers++;
529561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
529661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
529761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ptr_respbuffer) {
529861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
529961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
530061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
530161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
530261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
530361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
530461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.FillBufferDone (hComp,m_app_data,buffer);
530561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pending_output_buffers--;
530661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
530761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
530861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
530961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
531061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
531161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
531261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&buf, 0, sizeof(buf));
531361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
531461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
531561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
531661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = nPortIndex;
531761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
531861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
531961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].bytesused = buffer->nFilledLen;
532061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].length = drv_ctx.op_buf.buffer_size;
532161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].m.userptr =
532261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
532361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
532461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
532561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
532661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].data_offset = 0;
532761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
532861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
532961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].bytesused = 0;
533061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
533161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
53326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
533361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
53346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
533561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
533661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].data_offset = 0;
533761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra_idx >= VIDEO_MAX_PLANES) {
53388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extradata index higher than expected: %d", extra_idx);
533961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
534061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
534161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = plane;
534261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = drv_ctx.num_planes;
534361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
534461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
534561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
534661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf to driver");
534761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinreturn OMX_ErrorNone;
5349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
535261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
535361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SetCallbacks
5354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
535561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
535661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Set the callbacks.
5357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
535861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
535961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
536161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
536261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
5363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
536461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
536661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_CALLBACKTYPE* callbacks,
536761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR             appData)
5368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
537061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_cb       = *callbacks;
53718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
537261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EventHandler,m_cb.FillBufferDone);
537361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_app_data =    appData;
537461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
5375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
537861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
537961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentDeInit
5380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
538161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
538261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Destroys the component and release memory allocated to the heap.
5383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
538461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
538561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
538761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
538861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
5389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
539061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
5392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
53946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    unsigned i = 0;
539561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_StateLoaded != m_state) {
53968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\
539761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state);
53988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Playback Ended - FAILED");
539961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
54008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Playback Ended - PASSED");
5401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the output buffers have to be cleaned up*/
540461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
54058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Freeing the Output Memory");
540661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) {
540761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_output_buffer (&m_out_mem_ptr[i]);
5408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
540961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ICS_
541061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
541161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
5412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the input buffers have to be cleaned up*/
541561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr || m_inp_heap_ptr) {
54168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Freeing the Input Memory");
541761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) {
541861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_inp_mem_ptr)
541961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer (i,&m_inp_mem_ptr[i]);
542061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else
542161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer (i,NULL);
5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer_header();
5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_output_buffer_header();
542661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer) {
5427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(h264_scratch.pBuffer);
5428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.pBuffer = NULL;
5429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
543161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_parser) {
5432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete h264_parser;
543361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_parser = NULL;
5434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
543661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_platform_list) {
5437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_platform_list);
5438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_platform_list = NULL;
5439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
544061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_vendor_config.pData) {
5441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_vendor_config.pData);
5442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_vendor_config.pData = NULL;
5443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Reset counters in mesg queues
5446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_size=0;
5447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_size=0;
5448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_size=0;
5449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_read = m_ftb_q.m_write =0;
5450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_read = m_cmd_q.m_write =0;
5451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_read = m_etb_q.m_write =0;
5452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
545361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
545461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_timestamp_list.reset_ts_list();
5455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
54588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG");
5459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
546061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // NULL);
54618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Close the driver instance");
54626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
5463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
5464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (inputBufferFile1);
5465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
54676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    if (outputBufferFile1)
546861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fclose (outputBufferFile1);
5469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
5471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputExtradataFile);
5472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
54738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec::component_deinit() complete");
547461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
547861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
547961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseEGLImage
5480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
548161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
548261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use EGL Image method implementation <TBD>.
5483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
548461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
548561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
548761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
548861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Not Implemented error.
5489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
549061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
549261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
549361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
549461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                     appData,
549561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN void*                      eglImage)
5496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
549761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
549861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
549961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
5500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
550261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
550361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    EGLint fd = -1, offset = 0,pmemPtr = 0;
5504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
550561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fd = -1, offset = 0;
5506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
55078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("use EGL image support for decoder");
550861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
55098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("");
551061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
551261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_display_id == NULL) {
55138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Display ID is not set by IL client");
5514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
551561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
551661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
551761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eglGetProcAddress("eglQueryImageKHR");
551861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
551961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
552061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
5521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app
5522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl {
5523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int pmem_fd;
5524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int offset;
5525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    };
5526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl *temp_egl_id = NULL;
5527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    void * pmemPtr = (void *) eglImage;
5528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    temp_egl_id = (struct temp_egl *)eglImage;
552961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_egl_id != NULL) {
5530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fd = temp_egl_id->pmem_fd;
5531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        offset = temp_egl_id->offset;
5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (fd < 0) {
55358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd);
5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
553761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
553861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_info.pmem_fd = (OMX_U32) fd;
553961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_info.offset = (OMX_U32) offset;
554061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_entry.entry = (void *) &pmem_info;
554161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
554261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_list.entryList = &pmem_entry;
554361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_list.nEntries = 1;
554461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers = true;
554561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
554661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
554761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (OMX_U8 *)pmemPtr)) {
55488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("use buffer call failed for egl image");
554961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
555061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
555161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
555561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
555661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentRoleEnum
5557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
555861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
555961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Component Role Enum method implementation.
5560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
556161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
556261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
556461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
556561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything is successful.
556661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
556861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_U8*        role,
556961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32        index)
5570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
557161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
5572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
557361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
557461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
557561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
55768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
557761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
557861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
557961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
558161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
558261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
558361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
55848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
558561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
558661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
558761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
558861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
558961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
559061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
55918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
559261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
55938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
559461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
559561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
559861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
559961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) ) {
560061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
560161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
56028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
560361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
560561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
560661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
560761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
560861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
560961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
56108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
561161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
561361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
561461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
561561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
561661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
561761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
56188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
561961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
562161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
562261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
562361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
562461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
562561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ) {
562661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
562761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
56288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
562961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
563161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
563261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
563361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
563461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
563561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
56368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
563761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
563961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
564061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
564161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
56428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component");
564361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInvalidComponentName;
56446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
564561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
5646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
565261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
565361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateDone
5654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
565561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
565661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if entire buffer pool is allocated by IL Client or not.
565761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Need this to move to IDLE state.
5658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
565961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
566061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
566261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
566361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
5664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
566561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void)
5667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
566861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
566961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet_In = false;
567061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet_Out = false;
5671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
567261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet_In = allocate_input_done();
567361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet_Out = allocate_output_done();
5674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
567561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bRet_In && bRet_Out) {
567661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
567761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
567961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
568261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
568361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateInputDone
5684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
568561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
568661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if I/P buffer pool is allocated by IL Client or not.
5687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
568861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
568961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
569261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
5693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void)
5696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
569761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
569861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0;
569961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
570061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr == NULL) {
570161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bRet;
570261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
570361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr ) {
570461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; i<drv_ctx.ip_buf.actualcount; i++) {
570561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
570661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
570761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
570861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
570961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
571061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i == drv_ctx.ip_buf.actualcount) {
571161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
571261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
571361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
571461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
571561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_bPopulated = OMX_TRUE;
571661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
571761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
572061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
572161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateOutputDone
5722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
572361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
572461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if entire O/P buffer pool is allocated by IL Client or not.
5725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
572661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
572761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
572961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
573061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
5731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
573261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void)
5734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
573561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
573661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned j=0;
573761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
573861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr == NULL) {
573961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bRet;
574061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
574161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
574261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
574361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j < drv_ctx.op_buf.actualcount; j++) {
574461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_out_bm_count,j)) {
574561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
574661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
574761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
574861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
574961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
575061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (j == drv_ctx.op_buf.actualcount) {
575161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
575261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
575361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_bEnabled)
575461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bPopulated = OMX_TRUE;
575561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
575761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
576161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
576261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseDone
5763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
576461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
576561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
5766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
576761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
576861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
577061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
577161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
577361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void)
5775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
577661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
5777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
577861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (release_input_done()) {
577961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_output_done()) {
578061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
578161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
578361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
578861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
578961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseOutputDone
5790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
579161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
579261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
5793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
579461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
579561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
579761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
579861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
580061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void)
5802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
580361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
580461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0,j=0;
580561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
58068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p",m_inp_mem_ptr);
580761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
580861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j < drv_ctx.op_buf.actualcount ; j++) {
580961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_out_bm_count,j)) {
581061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
581161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
581261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
581361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (j == drv_ctx.op_buf.actualcount) {
581461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bm_count = 0;
581561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
581661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
581761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
581861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_bm_count = 0;
581961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
582061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
582161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
582461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
582561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseInputDone
5826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
582761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
582861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
5829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
583061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
583161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
583361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
583461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
583661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void)
5838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
583961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
584061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0,j=0;
584161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
58428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
584361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr) {
584461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j<drv_ctx.ip_buf.actualcount; j++) {
584561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
584661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
584761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
584861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
584961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (j==drv_ctx.ip_buf.actualcount) {
585061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
585161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
585261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
585361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
585461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
585561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
585961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE * buffer)
5860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
586161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
586261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) {
58638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer);
586461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
586561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (output_flush_progress) {
586661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
586761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
586861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nTimeStamp = 0;
586961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
587061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
587161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
587261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
58748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
587561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer, buffer->pBuffer);
587661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers --;
5877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
587861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
58798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Output EOS has been reached");
588061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!output_flush_progress)
588161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event((unsigned)NULL, (unsigned)NULL,
588261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EOS_DONE);
5883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
588461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame) {
588561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
588661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
588761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
588861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame) {
588961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFilledLen = 0;
589061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL,
589161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL);
589261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = NULL;
589361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
589461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
589561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
58968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("In fill Buffer done call address %p ",buffer);
589761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_BUFFER_LOG
589861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (outputBufferFile1 && buffer->nFilledLen) {
589961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int buf_index = buffer - m_out_mem_ptr;
590061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int stride = drv_ctx.video_resolution.stride;
590161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int scanlines = drv_ctx.video_resolution.scan_lines;
590261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
590361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int i;
590461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int bytes_written = 0;
590561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
590661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
590761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp += stride;
590861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
590961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
591061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int stride_c = stride;
591161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
591261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
591361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp += stride_c;
591461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
591561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
591761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
591861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* For use buffer we need to copy the data */
591961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!output_flush_progress) {
592061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.get_next_timestamp(buffer,
592161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
592261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ?true:false);
592361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_debug_timestamp) {
592461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
592561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_TICKS expected_ts = 0;
592661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_timestamp_list.pop_min_ts(expected_ts);
59278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
592861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nTimeStamp, expected_ts);
592961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
593061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (buffer->nTimeStamp != expected_ts) {
59318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check");
593261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
593361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
593461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
593661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_cb.FillBufferDone) {
593761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFilledLen > 0) {
593861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            handle_extradata(buffer);
593961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (client_extradata & OMX_TIMEINFO_EXTRADATA)
594061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep min timestamp interval to handle corrupted bit stream scenario
594161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                set_frame_rate(buffer->nTimeStamp);
594261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (arbitrary_bytes)
594361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                adjust_timestamp(buffer->nTimeStamp);
594461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (perf_flag) {
594561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!proc_frms) {
594661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    dec_time.stop();
594761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    latency = dec_time.processing_time_us() - latency;
594861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
594961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    dec_time.start();
595061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fps_metrics.start();
595161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
595261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                proc_frms++;
595361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
595461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_U64 proc_time = 0;
595561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fps_metrics.stop();
595661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    proc_time = fps_metrics.processing_time_us();
595761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
595861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            proc_frms, (float)proc_time / 1e6,
595961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (float)(1e6 * proc_frms) / proc_time);
596061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    proc_frms = 0;
596161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
596261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
596361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
596461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_EXTRADATA_LOG
596561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (outputExtradataFile) {
596661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
596761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
596861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                p_extra = (OMX_OTHER_EXTRADATATYPE *)
596961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((unsigned)(buffer->pBuffer + buffer->nOffset +
597061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nFilledLen + 3)&(~3));
597161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                while (p_extra &&
597261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) {
59738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
597461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
597561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p_extra->eType == OMX_ExtraDataNone) {
597661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
597761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
597861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
597961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
598061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
598161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
598261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
598361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
598461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts = LLONG_MAX;
598561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rst_prev_ts = true;
598661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
598761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
598861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
598961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
599061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             buffer->pPlatformPrivate)->entryList->entry;
59918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
599261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *il_buffer;
599361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        il_buffer = client_buffers.get_il_buf_hdr(buffer);
599461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (il_buffer)
599561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
599661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else {
599761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
599861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
599961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
60008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
600161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
600261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
60036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
6004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
600561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
600961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE* buffer)
6010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
601261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) {
60138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer);
601461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
60178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
601861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer, buffer->pBuffer);
6019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_input_buffers--;
6020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
602161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
602261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame == NULL && input_flush_progress == false) {
60238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer);
602461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = buffer;
602561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen = 0;
602661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nTimeStamp = LLONG_MAX;
602761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            push_input_buffer (hComp);
602861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
60298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer);
603061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen = 0;
603161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_input_free_q.insert_entry((unsigned)buffer,
603261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned)NULL, (unsigned)NULL)) {
60338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error");
603461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
6035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
603661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_cb.EmptyBufferDone) {
6037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nFilledLen = 0;
603861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (input_use_buffer == true) {
6039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
6040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
6042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
6044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message)
6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
604861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec* omx = NULL;
604961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_msginfo *vdec_msg = NULL;
605061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
605161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer *v4l2_buf_ptr = NULL;
605261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_output_frameinfo *output_respbuf = NULL;
605361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc=1;
605461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (context == NULL || message == NULL) {
60558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check");
605661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
605761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
605861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    vdec_msg = (struct vdec_msginfo *)message;
605961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
606061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = reinterpret_cast<omx_vdec*>(context);
606161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
606261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (vdec_msg->msgcode) {
606361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
606461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_HW_ERROR:
606561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
606661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
606761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
606861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
606961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_START_DONE:
607061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
607161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_START_DONE);
607261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
607361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
607461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_STOP_DONE:
607561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
607661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_STOP_DONE);
607761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
607861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
607961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_RESUME_DONE:
608061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
608161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_RESUME_DONE);
608261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
608361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
608461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_PAUSE_DONE:
608561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
608661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_PAUSE_DONE);
608761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
608861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
608961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
609061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
609161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
609261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
609361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
609461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
609561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
609661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
609761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_INPUT_FLUSHED:
609861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
609961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
610061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* omxhdr = (OMX_BUFFERHEADERTYPE* )
610161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan               vdec_msg->msgdata.input_frame_clientdata; */
610261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
610361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
610461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
610561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (omxhdr == NULL ||
610661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) {
610761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omxhdr = NULL;
610861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg->status_code = VDEC_S_EFATAL;
610961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
611061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
611161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
611261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EBD);
611361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
611461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
611561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int64_t *timestamp;
611661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            timestamp = (int64_t *) malloc(sizeof(int64_t));
611761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (timestamp) {
611861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
611961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
612061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
61218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Field dropped time stamp is %lld",
612261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        vdec_msg->msgdata.output_frame.time_stamp);
612361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
612461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
612561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_OUTPUT_FLUSHED:
612661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
612761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
612861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
612961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
613061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
613161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
613261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg->msgdata.output_frame.pic_type);
613361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
613461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (omxhdr && omxhdr->pOutputPortPrivate &&
613561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
613661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
613761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) {
613861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen) {
613961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
614061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
614161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
614261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags;
614361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
61448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) {
614561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
614661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        //rc = -1;
614761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
614861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
614961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
615061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
615161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg->msgdata.output_frame.bufferaddr =
615261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
615361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft !=
615461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    vdec_msg->msgdata.output_frame.framesize.left)
615561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top)
615661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right)
615761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) {
615861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
615961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top;
616061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
616161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
61628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("Crop information has changed");
616361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop,
616461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
616561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
616661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf = (struct vdec_output_frameinfo *)\
616761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     omxhdr->pOutputPortPrivate;
616861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf->len = vdec_msg->msgdata.output_frame.len;
616961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
617061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
617161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_I;
617261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
617361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
617461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_P;
617561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
617661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
617761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_B;
617861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
617961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
618061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (omx->output_use_buffer)
618161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        memcpy ( omxhdr->pBuffer, (void *)
618261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
618361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 (unsigned long)vdec_msg->msgdata.output_frame.offset),
618461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                vdec_msg->msgdata.output_frame.len);
618561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
618661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFilledLen = 0;
618761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
618861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_FBD);
618961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
619061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
619161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EOS_DONE);
619261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else
619361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
619461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
619561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
619661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_CONFIG_CHANGED:
61978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Port settings changed");
619861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
619961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_PORT_RECONFIG);
620061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
620161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
620261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
62038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Port settings changed info");
620461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // get_buffer_req and populate port defn structure
620561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ERRORTYPE eRet = OMX_ErrorNone;
620661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_format fmt;
620761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int ret;
620861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
620961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
621061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height);
621161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->drv_ctx.video_resolution.stride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline;
621261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->drv_ctx.video_resolution.scan_lines = fmt.fmt.pix_mp.plane_fmt[0].reserved[0];
621361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->m_port_def.nPortIndex = 1;
621461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = omx->update_portdef(&(omx->m_port_def));
621561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
621661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
621761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
621861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
621961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
622061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
622161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
622261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
6223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
622661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_HANDLETYPE hComp,
622761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *buffer
622861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
6229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
623061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
62318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Empty this arbitrary");
623261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
623361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
623461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
623561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
62368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
62378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
623861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
623961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
624061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return zero length and not an EOS buffer */
624161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return buffer if input flush in progress */
624261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
624361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
62448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress");
624561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
624661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
624761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
624861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
624961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (psource_frame == NULL) {
62508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
625161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = buffer;
62528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Try to Push One Input Buffer ");
625361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        push_input_buffer (hComp);
625461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
62558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer);
625661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL,
625761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL)) {
625861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
625961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
626061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
626161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
626261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
6264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
6267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
626861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
626961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
627061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
627161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pdest_frame == NULL || psource_frame == NULL) {
627261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if we have a destination buffer*/
627361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame == NULL) {
62748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Get a Destination buffer from the queue");
627561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_free_q.m_size) {
627661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_free_q.pop_entry(&address,&p2,&id);
627761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
627861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen = 0;
627961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = LLONG_MAX;
62808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame);
628161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
628261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
628361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
628461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if we have a destination buffer*/
628561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame == NULL) {
62868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Get a source buffer from the queue");
628761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_pending_q.m_size) {
628861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_pending_q.pop_entry(&address,&p2,&id);
628961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame = (OMX_BUFFERHEADERTYPE *)address;
62908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame,
629161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nTimeStamp);
62928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer flag %d length %d",
629361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nFlags,psource_frame->nFilledLen);
629461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
629561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
629661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
629761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
629861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
629961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
630061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while ((pdest_frame != NULL) && (psource_frame != NULL)) {
630161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_type_parse) {
630261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_MPEG4:
630361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_H263:
630461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_MPEG2:
630561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret =  push_input_sc_codec(hComp);
630661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
630761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_H264:
630861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_h264(hComp);
630961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
631061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_HEVC:
631161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_hevc(hComp);
631261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
631361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_VC1:
631461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_vc1(hComp);
631561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
631661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
631761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
631861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
631961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret != OMX_ErrorNone) {
63208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Pushing input Buffer Failed");
632161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx_report_error ();
632261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
632361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
632461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
632561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
632661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
6327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
6330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
633161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
633261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
633361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
6334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
63358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %d",
633661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame,psource_frame->nTimeStamp);
633761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_frame_parser.parse_sc_frame(psource_frame,
633861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame,&partial_frame) == -1) {
63398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error In Parsing Return Error");
634061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
634261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
634361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
63448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Frame size %d source %p frame count %d",
634561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen,psource_frame,frame_count);
634661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
634761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
63488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("TimeStamp updated %d",pdest_frame->nTimeStamp);
634961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*First Parsed buffer will have only header Hence skip*/
635061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (frame_count == 0) {
63518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame ");
635261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
635361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (codec_type_parse == CODEC_TYPE_MPEG4 ||
635461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    codec_type_parse == CODEC_TYPE_DIVX) {
635561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mp4StreamType psBits;
635661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
635761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psBits.numBytes = pdest_frame->nFilledLen;
635861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mp4_headerparser.parseHeader(&psBits);
635961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
636061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
636161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_count++;
636261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
636361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
636461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame->nFilledLen) {
636561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
636661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
636761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
636861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
636961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
637061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
637161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
637261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_input_free_q.m_size) {
637361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_input_free_q.pop_entry(&address,&p2,&id);
637461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
637561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen = 0;
637661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
637761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
63788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Zero len buffer return back to POOL");
637961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL,
638061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned)NULL);
638161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
638261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
638361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
638461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
63858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Not a Complete Frame %d",pdest_frame->nFilledLen);
638661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
638761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame->nAllocLen ==
638861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen + pdest_frame->nOffset) {
63898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled");
639061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
639161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
639261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
639361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
639461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (psource_frame->nFilledLen == 0) {
639561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
639661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
639761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags |= psource_frame->nFlags;
63988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x",
639961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
64008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Found a frame size = %d number = %d",
640161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,frame_count++);
640261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
640361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
640461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
640561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
640661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
640761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
640861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
64098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr") ;
641061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
641161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
641261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
641361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (generate_ebd) {
64148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame);
641561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
641661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
641761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
641861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_pending_q.m_size) {
64198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
642061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_pending_q.pop_entry(&address,&p2,&id);
642161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame = (OMX_BUFFERHEADERTYPE *) address;
64228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame,
642361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nTimeStamp);
64248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer flag %d length %d",
642561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nFlags,psource_frame->nFilledLen);
642661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
642761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
642861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
642961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
6433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
643461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
643561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
643661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL isNewFrame = OMX_FALSE;
643761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
643861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
643961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer == NULL) {
64408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated");
644161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
64438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %d "
644461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
64458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
644661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.nFilledLen && look_ahead_nal) {
644761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
644861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
644961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen) {
6450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
6451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
6452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
64538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame");
6454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_scratch.nFilledLen = 0;
645561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
64568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264");
6457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
6458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
645961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
646061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nal_length == 0) {
64618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Zero NAL, hence parse using start code");
646261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_sc_frame(psource_frame,
646361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
64648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
6465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
6466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
646761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
64688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
646961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_h264_nallength(psource_frame,
647061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
64718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
647261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
6473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
647461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
6475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
647661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
647761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
64788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
647961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_count++;
648061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
648161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFlags = psource_frame->nFlags;
648261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
64838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen);
648461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.nFilledLen) {
648561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
648661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        NALU_TYPE_SPS);
6487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
648861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (client_extradata & OMX_TIMEINFO_EXTRADATA)
648961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
649061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
649161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
649261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // If timeinfo is present frame info from SEI is already processed
649361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
649461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
649561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
649661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
649761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_count++;
649861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
649961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nTimeStamp = h264_last_au_ts;
650061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFlags = h264_last_au_flags;
650161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef PANSCAN_HDLR
650261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
650361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_parser->update_panscan_data(h264_last_au_ts);
650461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
650561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
650661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
650761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
650861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_ts = h264_scratch.nTimeStamp;
650961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_flags = h264_scratch.nFlags;
651061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
651161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
651261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
651361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!VALID_TS(h264_last_au_ts))
651461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_last_au_ts = ts_in_sei;
651561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
651661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
651761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
651861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_ts = LLONG_MAX;
651961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
652061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
652161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!isNewFrame) {
652261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
652361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen) {
65248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %d",
652561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen);
652661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
652761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
652861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
652961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
653061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
653161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.nFilledLen = 0;
653261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
65338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264");
653461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
653561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
653661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
653761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                look_ahead_nal = true;
65388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x",
653961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
65408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Found a frame size = %d number = %d",
654161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,frame_count++);
654261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
654361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pdest_frame->nFilledLen == 0) {
65448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Copy the Current Frame since and push it");
654561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    look_ahead_nal = false;
654661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
654761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen) {
654861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
654961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                h264_scratch.pBuffer,h264_scratch.nFilledLen);
655061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
655161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen = 0;
655261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
65538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264");
655461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
655561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
655661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
655761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
65588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("Reset the EOS Flag");
655961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
656061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
656161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    /*Push the frame to the Decoder*/
656261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
656361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
656461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
656561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    //frame_count++;
656661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = NULL;
656761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_input_free_q.m_size) {
656861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_input_free_q.pop_entry(&address,&p2,&id);
656961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
65708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame);
657161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen = 0;
657261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags = 0;
657361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = LLONG_MAX;
657461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
657561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
657661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
657761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
657861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
65798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
658061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
658161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (h264_scratch.nAllocLen ==
658261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen + h264_scratch.nOffset) {
65838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
658461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
6585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
658661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
658761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
658861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!psource_frame->nFilledLen) {
65898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
659061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
659161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
659261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
65938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
659461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
659561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen) {
659661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
659761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
659861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
659961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.nFilledLen = 0;
660061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
66018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264");
660261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
660361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
660461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
660561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
660661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
66078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%d TimeStamp = %x",
660861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
66098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++);
661061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
661161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
661261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
661361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!VALID_TS(pdest_frame->nTimeStamp))
661461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = ts_in_sei;
661561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
6616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
661761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
661861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
661961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
662061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
662161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
662261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
662361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
66248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d",
662561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame,h264_scratch.nFilledLen);
662661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
662761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
662861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
662961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
663061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (generate_ebd && !psource_frame->nFilledLen) {
663161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
663261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = NULL;
663361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_input_pending_q.m_size) {
66348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
663561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&address,&p2,&id);
663661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
66378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Next source Buffer flag %d src length %d",
663861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    psource_frame->nFlags,psource_frame->nFilledLen);
663961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
664061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
664161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
66446eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc)
6645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
66466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_ERRORTYPE rc = OMX_ErrorNone;
664761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) {
66486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        memcpy ((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen);
66498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pDst->nTimeStamp == LLONG_MAX) {
66506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            pDst->nTimeStamp = pSrc->nTimeStamp;
66516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            DEBUG_PRINT_LOW("Assign Dst nTimeStamp=%lld", pDst->nTimeStamp);
6652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
66536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        pDst->nFilledLen += pSrc->nFilledLen;
66546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        pSrc->nFilledLen = 0;
665561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
66568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Destination buffer overflow");
66576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        rc = OMX_ErrorBadParameter;
6658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
66596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return rc;
6660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
66626eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_hevc (OMX_HANDLETYPE hComp)
6663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
666461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
666561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
666661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL isNewFrame = OMX_FALSE;
666761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
666861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE rc = OMX_ErrorNone;
666961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
667061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer == NULL) {
66718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated");
667261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
66736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
667461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
667561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
66768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("h264_scratch.nFilledLen %d has look_ahead_nal %d pdest_frame nFilledLen %d nTimeStamp %lld",
667761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFilledLen, look_ahead_nal, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
667861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
667961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.nFilledLen && look_ahead_nal) {
668061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
668161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
668261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // copy the lookahead buffer in the scratch
66836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        rc = copy_buffer(pdest_frame, &h264_scratch);
668461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc != OMX_ErrorNone) {
668561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc;
668661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
668761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
668861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nal_length == 0) {
668961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_sc_frame(psource_frame,
669061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
66918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
66926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            return OMX_ErrorBadParameter;
66936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
669461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
66958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length);
669661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_h264_nallength(psource_frame,
669761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
66988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
66996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            return OMX_ErrorBadParameter;
670061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
670161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
670261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
670361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
670461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
67058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
670661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_count++;
670761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
670861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFlags = psource_frame->nFlags;
670961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
67108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen);
671161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.nFilledLen) {
671261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mHEVCutils.isNewFrame(&h264_scratch, 0, isNewFrame);
671361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_count++;
671461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
671561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
671661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!isNewFrame) {
67178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %d nTimestamp %lld, pdest_frame nFilledLen %d nTimestamp %lld",
671861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen, h264_scratch.nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
671961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc = copy_buffer(pdest_frame, &h264_scratch);
672061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( rc != OMX_ErrorNone) {
672161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return rc;
672261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
672361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
672461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                look_ahead_nal = true;
672561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pdest_frame->nFilledLen == 0) {
672661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    look_ahead_nal = false;
67278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer");
672861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    rc = copy_buffer(pdest_frame, &h264_scratch);
672961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( rc != OMX_ErrorNone ) {
673061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
673161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
673261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
673361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
673461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
673561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
673661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
67378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("FrameDetecetd # %d pdest_frame nFilledLen %d nTimeStamp %lld, look_ahead_nal in h264_scratch nFilledLen %d nTimeStamp %lld",
673861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            frame_count++, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
673961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
674061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
674161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
674261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = NULL;
674361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_input_free_q.m_size) {
674461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_input_free_q.pop_entry(&address,&p2,&id);
674561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
67468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("pop the next pdest_buffer %p",pdest_frame);
674761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen = 0;
674861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags = 0;
674961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = LLONG_MAX;
675061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
675161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
675261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
675361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
675461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
67558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %d nTimeStamp %lld, pdest_frame nFilledLen %d nTimeStamp %lld, h264_scratch nFilledLen %d nTimeStamp %lld",
675661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame->nFilledLen, psource_frame->nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
675761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
675861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
675961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (h264_scratch.nAllocLen ==
676061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen + h264_scratch.nOffset) {
67618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
676261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
676361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
676461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
676561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
676661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!psource_frame->nFilledLen) {
67678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
676861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
676961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
677061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
67718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
677261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc = copy_buffer(pdest_frame, &h264_scratch);
677361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( rc != OMX_ErrorNone ) {
677461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return rc;
677561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
677661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
677761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
677861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
67798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%d TimeStamp = %lld",
678061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frame_count, pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
678161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
678261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
678361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
678461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
678561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
678661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
678761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
678861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
67898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d",
679061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame,h264_scratch.nFilledLen);
679161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
679261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
679361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
679461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
679561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (generate_ebd && !psource_frame->nFilledLen) {
679661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
679761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = NULL;
679861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_input_pending_q.m_size) {
679961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&address,&p2,&id);
680061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
68018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Next source Buffer flag %d nFilledLen %d, nTimeStamp %lld",
680261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    psource_frame->nFlags,psource_frame->nFilledLen, psource_frame->nTimeStamp);
680361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
680461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
680561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
68066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
68076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
68086eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
68096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
68106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_U8 *buf, *pdest;
68116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_U32 partial_frame = 1;
68126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_U32 buf_len, dest_len;
68136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
681461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (first_frame == 0) {
68156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        first_frame = 1;
68168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes");
681761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_vendor_config.pData) {
68188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Check profile type in 1st source buffer");
68196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            buf = psource_frame->pBuffer;
68206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            buf_len = psource_frame->nFilledLen;
68216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
68226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
682361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    VC1_SP_MP_START_CODE) {
68246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                m_vc1_profile = VC1_SP_MP_RCV;
682561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
68266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                m_vc1_profile = VC1_AP;
682761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
68288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer");
68296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                return OMX_ErrorStreamCorrupt;
68306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
683161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
68326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
68336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                pdest_frame->nOffset;
68346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
683561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nOffset);
68366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
683761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (dest_len < m_vendor_config.nDataSize) {
68388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Destination buffer full");
68396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                return OMX_ErrorBadParameter;
684061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
68416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
68426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
68436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
68446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
68456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
68466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
684761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (m_vc1_profile) {
68486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        case VC1_AP:
68498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code");
685061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
68518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code");
68526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                return OMX_ErrorBadParameter;
68536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
685461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
68556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
68566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        case VC1_SP_MP_RCV:
68576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        default:
68588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode");
68596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            return OMX_ErrorBadParameter;
68606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
68616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return OMX_ErrorNone;
68626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
68636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
686461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
686561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 alignment)
686661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
686761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem_allocation allocation;
686861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.size = buffer_size;
686961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.align = clip2(alignment);
687061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocation.align < 4096) {
687161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocation.align = 4096;
687261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
687361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
68748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)",
687561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                allocation.align, allocation.size);
687661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
687761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
687861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
687961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
68806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
68816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
688261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 alignment, struct ion_allocation_data *alloc_data,
688361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct ion_fd_data *fd_data, int flag)
68846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
688561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fd = -EINVAL;
688661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = -EINVAL;
688761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ion_dev_flag;
688861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_ion ion_buf_info;
688961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!alloc_data || buffer_size <= 0 || !fd_data) {
68908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory");
689161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -EINVAL;
689261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
689361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ion_dev_flag = O_RDONLY;
689461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fd = open (MEM_DEVICE, ion_dev_flag);
689561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
68968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd);
689761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return fd;
689861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
689961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->flags = 0;
690061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!secure_mode && (flag & ION_FLAG_CACHED)) {
690161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->flags |= ION_FLAG_CACHED;
690261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
690361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->len = buffer_size;
690461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->align = clip2(alignment);
690561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (alloc_data->align < 4096) {
690661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->align = 4096;
690761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
690861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((secure_mode) && (flag & ION_SECURE))
690961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->flags |= ION_SECURE;
691061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
691161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_
6912f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    alloc_data->heap_id_mask = ION_HEAP(ION_ADSP_HEAP_ID);
691361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else
6914f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
691561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
691661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (secure_mode) {
6917f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID);
691861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
691961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
692061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc || !alloc_data->handle) {
69218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION ALLOC memory failed ");
692261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->handle = NULL;
692361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(fd);
692461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd = -ENOMEM;
692561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return fd;
692661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
692761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fd_data->handle = alloc_data->handle;
692861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(fd,ION_IOC_MAP,fd_data);
692961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
69308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION MAP failed ");
693161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.ion_alloc_data = *alloc_data;
693261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.ion_device_fd = fd;
693361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.fd_ion_data = *fd_data;
693461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_ion_memory(&ion_buf_info);
693561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd_data->fd =-1;
693661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd = -ENOMEM;
693761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
693861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return fd;
6940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
694261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
6943dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
694461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
694561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!buf_ion_info) {
69468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata");
694761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
694861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
694961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
695061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &buf_ion_info->ion_alloc_data.handle)) {
69518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION: free failed" );
695261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
695361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    close(buf_ion_info->ion_device_fd);
695461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->ion_device_fd = -1;
695561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->ion_alloc_data.handle = NULL;
695661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->fd_ion_data.fd = -1;
6957dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
6958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header()
6960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
69618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ALL output buffers are freed/released");
696261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_use_buffer = false;
696361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers = false;
696461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
696561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
696661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (m_out_mem_ptr);
696761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = NULL;
696861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
696961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
697061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_platform_list) {
697161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(m_platform_list);
697261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_platform_list = NULL;
697361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
697461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
697561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_respbuffer) {
697661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_respbuffer);
697761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = NULL;
697861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
697961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_outputbuffer) {
698061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_outputbuffer);
698161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = NULL;
698261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
6983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
6984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
69858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free o/p ion context");
698661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(drv_ctx.op_buf_ion_info);
6987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
6988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header()
6993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = false;
699561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
699661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils) {
69978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free utils parser");
699861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            delete (m_frame_parser.mutils);
699961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils = NULL;
700061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
700161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
700261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr) {
70038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free input Heap Pointer");
700461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free (m_inp_heap_ptr);
700561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_heap_ptr = NULL;
700661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
700761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
700861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_phdr_pmem_ptr) {
70098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free input pmem header Pointer");
701061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free (m_phdr_pmem_ptr);
701161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_phdr_pmem_ptr = NULL;
701261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
701361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
701461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr) {
70158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free input pmem Pointer area");
701661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (m_inp_mem_ptr);
701761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_mem_ptr = NULL;
701861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
701961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_inputbuffer) {
70208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Driver Context pointer");
702161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_inputbuffer);
702261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer = NULL;
7023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info) {
70268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free ion context");
702761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(drv_ctx.ip_buf_ion_info);
7028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ip_buf_ion_info = NULL;
7029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
70326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
70336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::stream_off(OMX_U32 port)
7034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
703561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enum v4l2_buf_type btype;
703661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
703761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enum v4l2_ports v4l2_port = OUTPUT_PORT;
703861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
703961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
704061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
704161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        v4l2_port = OUTPUT_PORT;
704261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
704361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
704461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        v4l2_port = CAPTURE_PORT;
704561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_ALL) {
704661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
704761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
704861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
704961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc_input)
705061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc_input;
705161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
705261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc_output;
705361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
705461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
705561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!streaming[v4l2_port]) {
705661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // already streamed off, warn and move on
705761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
705861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                " which is already streamed off", v4l2_port);
705961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return 0;
706061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
706161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
706261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
706361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
706461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
706561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
706661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
70678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port);
706861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
706961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        streaming[v4l2_port] = false;
707061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
707161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
707261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
707361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
707461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
707561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
707661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
707761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
707861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
707961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
708061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
708161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret = 0;
708261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
708361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.memory = V4L2_MEMORY_USERPTR;
708461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.count = 1;
708561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
708661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
708761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
708861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
708961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
709061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
709161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
709261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
709361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
709461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadParameter;
709561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
709661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet==OMX_ErrorNone) {
709761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
709861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
709961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
710061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
710161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
710261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
710361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
710461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
710561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->actualcount = bufreq.count;
710661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->mincount = bufreq.count;
71078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Count = %d",bufreq.count);
710861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
710961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("GetBufReq: ActCnt(%d) Size(%d), BufType(%d)",
711061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
711161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
711261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
711361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
711461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
711561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
711661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
711761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height);
711861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
711961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
71208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Buffer Size (plane[0].sizeimage) = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
712161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
712261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
712361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
712461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
712561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
712661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
712761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int extra_idx = 0;
712861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
712961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size = buffer_prop->buffer_size;
713061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
713161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
713261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
713361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (extra_idx >= VIDEO_MAX_PLANES) {
71348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
713561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
713661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
713761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
713861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Frame info extra data enabled!");
713961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
714061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
714161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extradata & OMX_INTERLACE_EXTRADATA) {
714261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
714361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
714461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extradata & OMX_PORTDEF_EXTRADATA) {
714561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
71468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d",
714761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    client_extra_data_size);
714861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
714961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extra_data_size) {
715061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
715161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
715261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
715361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size;
715461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.count = buffer_prop->actualcount;
715561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.buffer_size = extra_data_size;
715661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size += client_extra_data_size;
715761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
715861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d)",
715961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type);
716061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (in_reconfig) // BufReq will be set to driver when port is disabled
716161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->buffer_size = buf_size;
716261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (buf_size != buffer_prop->buffer_size) {
716361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->buffer_size = buf_size;
716461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = set_buffer_req(buffer_prop);
716561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
716661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
71678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("GetBufReq OUT: ActCnt(%d) Size(%d), BufType(%d)",
716861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
716961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
717261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
717361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
717461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
717561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned buf_size = 0;
717661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
717761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
717861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret;
717961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
718061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size);
718161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
718261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buf_size != buffer_prop->buffer_size) {
718361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
718461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_prop->buffer_size, buf_size);
718561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadParameter;
718661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
718761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
718861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
718961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
719061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
719161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
719261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.pixelformat = output_capability;
719361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
719461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
719561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.pixelformat = capture_capability;
719661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
719761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
719861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
719961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
720061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
720161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
720261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
720361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
720461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
720561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
720661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
720761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
720861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.count = buffer_prop->actualcount;
720961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
721061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
721161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
721261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
721361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
721461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
721561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
721761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet==OMX_ErrorNone) {
721861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
721961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
722061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
722161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
722261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
722361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
722461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
722561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (bufreq.count < buffer_prop->actualcount) {
722661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
722761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    " on v4l2 port %d to %d (prefers %d)", bufreq.type,
722861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buffer_prop->actualcount, bufreq.count);
722961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
723061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
723161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!client_buffers.update_buffer_req()) {
723261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
723361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
723461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
723561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
723661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
723761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!eRet && buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
723861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // need to update extradata buffers also
723961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = buffer_prop->actualcount * drv_ctx.extradata_info.buffer_size;
724061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.count = buffer_prop->actualcount;
724161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
724261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7243dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
7244dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
7245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution()
7246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
724761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
724861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
7252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
725361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
725461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!portDefn) {
725561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
725661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
72578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("omx_vdec::update_portdef");
725861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
725961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->nSize = sizeof(portDefn);
726061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->eDomain    = OMX_PortDomainVideo;
726161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.frame_rate.fps_denominator > 0)
726261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
726361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.frame_rate.fps_denominator;
726461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
72658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Divide by zero");
726661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
7267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
726861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (0 == portDefn->nPortIndex) {
726961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir =  OMX_DirInput;
727061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
727161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
727261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
727361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
727461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eCompressionFormat = eCompressionFormat;
727561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bEnabled   = m_inp_bEnabled;
727661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bPopulated = m_inp_bPopulated;
727761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (1 == portDefn->nPortIndex) {
727861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int buf_size = 0;
727961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.update_buffer_req()) {
72808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed");
728161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
728261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
728361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.get_buffer_req(buf_size)) {
72848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("update buffer requirements");
728561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
728661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
728761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferSize = buf_size;
728861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir =  OMX_DirOutput;
728961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
729061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
729161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
729261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bEnabled   = m_out_bEnabled;
729361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bPopulated = m_out_bPopulated;
729461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
72958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error in getting color format");
729661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
729761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
729861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
729961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir = OMX_DirMax;
730061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
730161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (int)portDefn->nPortIndex);
730261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
730361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
730461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
730561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
730661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
730761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
730861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld"
73098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            " SliceHeight = %lu", portDefn->format.video.nFrameWidth,
731061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nFrameHeight,
731161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nStride,
731261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nSliceHeight);
731361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers()
7318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
731961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
732061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
732161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i= 0;
732261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
732361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
73248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation");
732561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nBufHdrSize        = 0;
732661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformEntrySize = 0;
732761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformListSize  = 0;
732861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPMEMInfoSize = 0;
732961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
733061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
733161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
733261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Setting First Output Buffer(%d)",
733461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
733561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufHdrSize        = drv_ctx.op_buf.actualcount *
733661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE);
733761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
733861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
733961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
734061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformListSize  = drv_ctx.op_buf.actualcount *
734161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
734261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
734361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
734461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
734661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof(OMX_BUFFERHEADERTYPE),
734761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,
734861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPlatformListSize);
73498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("PE %d bmSize %d",nPlatformEntrySize,
735061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_bm_count);
735161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
735261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Alloc mem for platform specific info
735361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *pPtr=NULL;
735461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
735561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,1);
735661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
735761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   calloc (sizeof(struct vdec_bufferpayload),
735861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.op_buf.actualcount);
735961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
736061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 calloc (sizeof (struct vdec_output_frameinfo),
736161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         drv_ctx.op_buf.actualcount);
7362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
736361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
736461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
7365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
736761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
736861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && drv_ctx.ptr_respbuffer) {
736961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufHdr          =  m_out_mem_ptr;
737061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
737161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
737261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_list)  + nPlatformListSize);
737361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
737461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_entry) + nPlatformEntrySize);
737561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformList   = m_platform_list;
737661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformEntry  = m_platform_entry;
737761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPMEMInfo       = m_pmem_info;
737861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
738061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
738161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Settting the entire storage nicely
73828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr,
738361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr,pPlatformEntry);
73848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
738561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
738661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
738761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
738861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Set the values when we determine the right HxW param
738961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nAllocLen          = 0;
739061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nFilledLen         = 0;
739161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pAppPrivate        = NULL;
739261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
739361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
739461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->entry      = pPMEMInfo;
739561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform List
739661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->nEntries    = 1;
739761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->entryList   = pPlatformEntry;
739861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep pBuffer NULL till vdec is opened
739961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pBuffer            = NULL;
740061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->offset          =  0;
740161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->pmem_fd = 0;
740261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pPlatformPrivate = pPlatformList;
740361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
7404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
740561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
7406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
740761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Create a mapping between buffers*/
740861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
740961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer[i].client_data = (void *) \
741061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        &drv_ctx.ptr_outputbuffer[i];
741161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Move the buffer and buffer header pointers
741261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr++;
741361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo++;
741461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry++;
741561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList++;
741661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
741761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
74188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
741961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr, pPtr);
742061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_out_mem_ptr) {
742161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_out_mem_ptr);
742261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr = NULL;
742361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
742461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pPtr) {
742561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(pPtr);
742661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPtr = NULL;
742761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
742861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer) {
742961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_outputbuffer);
743061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer = NULL;
743161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
743261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_respbuffer) {
743361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_respbuffer);
743461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer = NULL;
743561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
7436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
743761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.op_buf_ion_info) {
74388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free o/p ion context");
743961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.op_buf_ion_info);
744061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info = NULL;
744161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
7442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
744361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet =  OMX_ErrorInsufficientResources;
744461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
744561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
744661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet =  OMX_ErrorInsufficientResources;
7447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
744861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs()
7452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
745361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned p1;
745461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned p2;
745561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned ident;
745661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_cmd_queue tmp_q, pending_bd_q;
745761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
745861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // pop all pending GENERATE FDB from ftb queue
745961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_ftb_q.m_size) {
746061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.pop_entry(&p1,&p2,&ident);
746161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_FBD) {
746261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_bd_q.insert_entry(p1,p2,ident);
746361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
746461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            tmp_q.insert_entry(p1,p2,ident);
746561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
746761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //return all non GENERATE FDB to ftb queue
746861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (tmp_q.m_size) {
746961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        tmp_q.pop_entry(&p1,&p2,&ident);
747061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.insert_entry(p1,p2,ident);
747161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
747261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // pop all pending GENERATE EDB from etb queue
747361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_etb_q.m_size) {
747461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.pop_entry(&p1,&p2,&ident);
747561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_EBD) {
747661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_bd_q.insert_entry(p1,p2,ident);
747761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
747861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            tmp_q.insert_entry(p1,p2,ident);
747961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
748061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
748161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //return all non GENERATE FDB to etb queue
748261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (tmp_q.m_size) {
748361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        tmp_q.pop_entry(&p1,&p2,&ident);
748461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.insert_entry(p1,p2,ident);
748561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
748661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
748761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // process all pending buffer dones
748861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (pending_bd_q.m_size) {
748961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pending_bd_q.pop_entry(&p1,&p2,&ident);
749061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (ident) {
749161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_COMPONENT_GENERATE_EBD:
749261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
74938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!");
749461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
749561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
749661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
749761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
749861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_COMPONENT_GENERATE_FBD:
749961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
75008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!");
750161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
750261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
750361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
750461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
7509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
751061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 new_frame_interval = 0;
751161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
751261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) {
751361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        new_frame_interval = (act_timestamp > prev_ts)?
751461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            act_timestamp - prev_ts :
751561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts - act_timestamp;
751661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (new_frame_interval < frm_int || frm_int == 0) {
751761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frm_int = new_frame_interval;
751861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (frm_int) {
751961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.frame_rate.fps_numerator = 1e6;
752061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.frame_rate.fps_denominator = frm_int;
752161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
752261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frm_int, drv_ctx.frame_rate.fps_numerator /
752361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (float)drv_ctx.frame_rate.fps_denominator);
752461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
752561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
752661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
752761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prev_ts = act_timestamp;
7528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
7531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
753261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rst_prev_ts && VALID_TS(act_timestamp)) {
753361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = act_timestamp;
753461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = false;
753561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (VALID_TS(prev_ts)) {
753661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool codec_cond = (drv_ctx.timestamp_adjust)?
753761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
753861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
753961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
754061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (frm_int > 0 && codec_cond) {
754161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
754261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            act_timestamp = prev_ts + frm_int;
754361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
754461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts = act_timestamp;
754561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
754661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            set_frame_rate(act_timestamp);
754761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (frm_int > 0)          // In this case the frame rate was set along
754861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    {                               // with the port definition, start ts with 0
754961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
755061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
7551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
7555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
755661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
755761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_conceal_MB = 0;
755861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 frame_rate = 0;
755961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int consumed_len = 0;
756061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_MB_in_frame;
756161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 recovery_sei_flags = 1;
756261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int buf_index = p_buf_hdr - m_out_mem_ptr;
756361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
756461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
756561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        p_buf_hdr->nOffset;
756661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!drv_ctx.extradata_info.uaddr) {
756761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
756861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
756961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    p_extra = (OMX_OTHER_EXTRADATATYPE *)
757061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
757161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
757261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
757361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        p_extra = NULL;
757461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
757561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (data) {
757661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while ((consumed_len < drv_ctx.extradata_info.buffer_size)
75778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) {
757861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) {
757961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("Invalid extra data size");
758061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
758161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
758261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch ((unsigned long)data->eType) {
75838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO:
758461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_interlace_payload *payload;
758561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    payload = (struct msm_vidc_interlace_payload *)data->data;
75868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (payload->format != MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) {
758761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        int enable = 1;
758861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_U32 mbaff = 0;
758961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
75908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if ((payload->format == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
759161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
759261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        else
759361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
759461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (m_enable_android_native_buffers)
759561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
759661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    PP_PARAM_INTERLACED, (void*)&enable);
759761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
759861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) {
759961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        append_interlace_extradata(p_extra, payload->format);
760061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
760161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
760261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_FRAME_RATE:
760461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_framerate_payload *frame_rate_payload;
760561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data;
760661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    frame_rate = frame_rate_payload->frame_rate;
760761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_TIMESTAMP:
760961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_ts_payload *time_stamp_payload;
761061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    time_stamp_payload = (struct msm_vidc_ts_payload *)data->data;
761161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo;
761261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
761361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB:
761561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_concealmb_payload *conceal_mb_payload;
761661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data;
761761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
761861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
761961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
762061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_ASPECT_RATIO:
762261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
762361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)data->data;
762461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((struct vdec_output_frameinfo *)
762561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
762661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((struct vdec_output_frameinfo *)
762761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
762861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI:
763061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_recoverysei_payload *recovery_sei_payload;
763161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data;
763261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    recovery_sei_flags = recovery_sei_payload->flags;
76338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) {
763461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
76358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("Extradata: OMX_BUFFERFLAG_DATACORRUPT Received");
763661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
763761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW:
763961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data;
764061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
764161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
764261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    goto unrecognized_extradata;
764361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
764461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            consumed_len += data->nSize;
764561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
764661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
764761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
764861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
764961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            append_frame_info_extradata(p_extra,
765061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
765161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    panscan_payload,&((struct vdec_output_frameinfo *)
765261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
765361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
765461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
76556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalunrecognized_extradata:
765661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!secure_mode && client_extradata)
765761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        append_terminator_extradata(p_extra);
765861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
7659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
76616eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
766261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool is_internal, bool enable)
7663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
766461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
766561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
766661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state != OMX_StateLoaded) {
766761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
766861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
766961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
76708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d",
767161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata, requested_extradata, enable, is_internal);
767261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
767361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!is_internal) {
767461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (enable)
767561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata |= requested_extradata;
767661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
767761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata = client_extradata & ~requested_extradata;
767861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
767961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
768061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enable) {
768161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
768261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
768361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
768461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
768561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
76868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        " Quality of interlaced clips might be impacted.");
768761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
768861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) {
768961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
769061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
769161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
76928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set framerate extradata");
769361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
769461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
769561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
769661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
76978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set concealed MB extradata");
769861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
769961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
770061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
770161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata");
770361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
770461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
770561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
770661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
770861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
770961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
77108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO;
771161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
771361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
771461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
771561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
771661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
771761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set timeinfo extradata");
771961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
772061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
772161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
772261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = get_buffer_req(&drv_ctx.op_buf);
772361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
7724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
772861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
772961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *data_ptr = extra->data, data = 0;
773061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (byte_count < extra->nDataSize) {
773161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        data = *data_ptr;
773261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (data) {
773361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            num_MB += (data&0x01);
773461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            data >>= 1;
773561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
773661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        data_ptr++;
773761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        byte_count++;
773861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
773961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
774061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
774161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
7742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
774661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_debug_extradata)
774761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
7748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
775061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "============== Extra Data ==============\n"
7751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            "           Size: %lu\n"
7752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            "        Version: %lu\n"
7753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            "      PortIndex: %lu\n"
7754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            "           Type: %x\n"
77558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "       DataSize: %lu",
775661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra->nSize, extra->nVersion.nVersion,
775761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra->nPortIndex, extra->eType, extra->nDataSize);
775861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
775961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) {
776061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
776161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH(
776261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "------ Interlace Format ------\n"
7763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "                Size: %lu\n"
7764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "             Version: %lu\n"
7765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "           PortIndex: %lu\n"
7766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                " Is Interlace Format: %d\n"
7767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "   Interlace Formats: %lu\n"
77688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "=========== End of Interlace ===========",
776961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
777061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
777161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) {
777261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
777361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
777461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH(
777561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "-------- Frame Format --------\n"
7776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "             Picture Type: %d\n"
7777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "           Interlace Type: %d\n"
7778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                " Pan Scan Total Frame Num: %lu\n"
7779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "   Concealed Macro Blocks: %lu\n"
7780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "               frame rate: %lu\n"
7781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "           Aspect Ratio X: %lu\n"
77828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "           Aspect Ratio Y: %lu",
778361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->ePicType,
778461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->interlaceType,
778561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->panScan.numWindows,
778661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->nConcealedMacroblocks,
778761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->nFrameRate,
778861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->aspectRatio.aspectRatioX,
778961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->aspectRatio.aspectRatioY);
779061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
779161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) {
779261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH(
779361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "------------------------------\n"
7794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    "     Pan Scan Frame Num: %lu\n"
7795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    "            Rectangle x: %ld\n"
7796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    "            Rectangle y: %ld\n"
7797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    "           Rectangle dx: %ld\n"
77988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    "           Rectangle dy: %ld",
779961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
780061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
780161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
780261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
780361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
780461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra->eType == OMX_ExtraDataNone) {
780561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("========== End of Terminator ===========");
780661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
780761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
780861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
781261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 interlaced_format_type)
7813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
781461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_STREAMINTERLACEFORMAT *interlace_format;
781561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 mbaff = 0;
781661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
781761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
781861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
781961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
782061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
782161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
782261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
782361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
782461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
782561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
782661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
782761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
782861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
78298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE)  && !mbaff) {
783061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->bInterlaceFormat = OMX_FALSE;
783161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
783261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
783361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
783461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->bInterlaceFormat = OMX_TRUE;
783561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
783661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
783761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
783861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
7839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
78416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::fill_aspect_ratio_info(
784261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct vdec_aspectratioinfo *aspect_ratio_info,
784361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
78446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
784561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata = frame_info;
784661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
784761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
784861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX,
784961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_extradata->aspectRatio.aspectRatioY);
78506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
7851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
785361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
78546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        struct msm_vidc_panscan_window_payload *panscan_payload,
78556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        struct vdec_aspectratioinfo *aspect_ratio_info)
7856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
785761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
785861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct msm_vidc_panscan_window *panscan_window;
785961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
78606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        return;
786161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
786261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
786361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
786461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
786561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
786661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
786761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
786861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (picture_type) {
786961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_I:
787061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeI;
787161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
787261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_P:
787361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeP;
787461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
787561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_B:
787661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeB;
787761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
787861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
787961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
788061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
788161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
788261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
788361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
788461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
788561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
788661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
788761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
788861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->nConcealedMacroblocks = num_conceal_mb;
788961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->nFrameRate = frame_rate;
789061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->panScan.numWindows = 0;
789161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (panscan_payload) {
789261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
789361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        panscan_window = &panscan_payload->wnd[0];
789461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) {
789561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
789661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
789761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
789861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
789961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            panscan_window++;
790061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
790161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
790261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fill_aspect_ratio_info(aspect_ratio_info, frame_info);
790361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
7904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
790861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
790961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
791061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
791161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
791261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
791361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
791461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
791561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *portDefn = m_port_def;
791661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
79178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "sliceheight = %u",portDefn->format.video.nFrameHeight,
791861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nFrameWidth,
791961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nStride,
792061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nSliceHeight);
7921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
792561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!client_extradata) {
792661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
792761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
792861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
792961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
793061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = OMX_ExtraDataNone;
793161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = 0;
793261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->data[0] = 0;
793361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
793461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
7935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
7938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
793961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
794061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index >= drv_ctx.ip_buf.actualcount) {
79418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found");
794261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
794361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
794461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr == NULL) {
794561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_desc_buffer_ptr = (desc_buffer_hdr*) \
794661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            calloc( (sizeof(desc_buffer_hdr)),
794761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    drv_ctx.ip_buf.actualcount);
794861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_desc_buffer_ptr == NULL) {
79498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed ");
795061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
795161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
795261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
795361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
795461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
795561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr[index].buf_addr == NULL) {
79568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("desc buffer Allocation failed ");
795761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
795861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
795961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
796061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
7964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
796561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
796661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_demux_entries < 8192) {
796761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_offsets[m_demux_entries++] = address_offset;
796861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
796961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
7970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
7973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
797461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
797561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
797661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 index = 0;
797761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
797861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
797961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
798061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (index < bytes_to_parse) {
798161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
798261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
798361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
798461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 (buf[index+2] == 0x01)) ) {
798561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //Found start code, insert address offset
798661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            insert_demux_addr_offset(index);
798761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buf[index+2] == 0x01) // 3 byte start code
798861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index += 3;
798961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else                      //4 byte start code
799061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index += 4;
799161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
799261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            index++;
7993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
799461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
799561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
7996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
7999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
800061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //fix this, handle 3 byte start code, vc1 terminator entry
800161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *p_demux_data = NULL;
800261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 desc_data = 0;
800361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 start_addr = 0;
800461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 nal_size = 0;
800561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 suffix_byte = 0;
800661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 demux_index = 0;
800761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 buffer_index = 0;
800861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
800961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr == NULL) {
801061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
801161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
801261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
801361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
801461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
801561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_index > drv_ctx.ip_buf.actualcount) {
801661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index);
801761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
801861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
801961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
802061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
802161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
802261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ( ((OMX_U8*)p_demux_data == NULL) ||
802361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
802461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
802561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
802661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
802761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; demux_index < m_demux_entries; demux_index++) {
802861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0;
802961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            start_addr = m_demux_offsets[demux_index];
803061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
803161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
803261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
803361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
803461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
803561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (demux_index < (m_demux_entries - 1)) {
803661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
803761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
803861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
803961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
804061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
804161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    start_addr,
804261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    suffix_byte,
804361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    nal_size,
804461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    demux_index);
804561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = (start_addr >> 3) << 1;
804661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data |= (start_addr & 7) << 21;
804761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data |= suffix_byte << 24;
804861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
804961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
805061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
805161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
805261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
805361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
805461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_demux_data += 16;
805561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
805661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_type_parse == CODEC_TYPE_VC1) {
805761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("VC1 terminator entry");
805861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0;
805961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0x82 << 24;
806061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
806161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 4, 0, sizeof(OMX_U32));
806261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
806361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
806461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_demux_data += 16;
806561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_demux_entries++;
806661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
806761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //Add zero word to indicate end of descriptors
806861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(p_demux_data, 0, sizeof(OMX_U32));
806961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
807061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
807161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
807261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
807361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
807461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
807561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Demux table complete!");
807661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
8077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
80796eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
80806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
808161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enabled = false;
808261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = NULL;
808361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    init_members();
808461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ColorFormat = OMX_COLOR_FormatMax;
80856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
80866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
80876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
80886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
808961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = reinterpret_cast<omx_vdec*>(client);
80906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
80916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
809261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::allocate_color_convert_buf::init_members()
809361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
809461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocated_count = 0;
809561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_size_req = 0;
809661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_alignment_req = 0;
809761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_platform_list_client,0,sizeof(m_platform_list_client));
809861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
809961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
810061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
81016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
810261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
81036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
810461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (int i = 0; i < MAX_COUNT; i++)
810561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd[i] = -1;
81066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
810861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
810961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
811061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    c2d.destroy();
81116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
81136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::update_buffer_req()
81146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
811561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
811661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int src_size = 0, destination_size = 0;
811761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_COLOR_FORMATTYPE drv_color_format;
811861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
81198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid client in color convert");
812061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
812161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
812261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
81238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("No color conversion required");
812461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return status;
812561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
812661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
812761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
812861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ColorFormat != OMX_COLOR_FormatYUV420Planar) {
81298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion");
813061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = false;
813161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        goto fail_update_buf_req;
813261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
813361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    c2d.close();
813461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
813561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->drv_ctx.video_resolution.frame_width,
813661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            NV12_128m,YCbCr420P);
813761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
813861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = c2d.get_buffer_size(C2D_INPUT,src_size);
813961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (status)
814061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
814161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
814261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
814361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
814461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                !destination_size) {
81458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d"
814661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "driver size %d destination size %d",
814761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
814861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
814961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            c2d.close();
815061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req = 0;
815161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
815261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req = destination_size;
815361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
815461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
815561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
815661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
815761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
81586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
81596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_update_buf_req:
816061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
816161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
81626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
81646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::set_color_format(
816561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_COLOR_FORMATTYPE dest_color_format)
81666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
816761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
816861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_COLOR_FORMATTYPE drv_color_format;
816961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
81708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid client in color convert");
817161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
817261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
817361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
817461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
817561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_color_format = (OMX_COLOR_FORMATTYPE)
817661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
817761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
81788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Incorrect color format");
81796eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        status = false;
81806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
818161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status && (drv_color_format != dest_color_format)) {
81828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Enabling C2D");
818361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
81848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Unsupported color format for c2d");
818561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
818661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
818761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ColorFormat = OMX_COLOR_FormatYUV420Planar;
818861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (enabled)
818961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                c2d.destroy();
819061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            enabled = false;
819161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!c2d.init()) {
81928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("open failed for c2d");
819361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
819461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else
819561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                enabled = true;
819661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
819761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
819861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (enabled)
819961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            c2d.destroy();
820061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enabled = false;
820161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
820261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
820361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
82046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
82066eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
82076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
820861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
82098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
821061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
821161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
821261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
821361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return omx->m_out_mem_ptr;
821461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return m_out_mem_ptr_client;
82156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
821761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
821861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd)
82196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
822061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
82218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
822261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
822361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
822461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
822561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bufadd;
822661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
822761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned index = 0;
822861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufadd - omx->m_out_mem_ptr;
822961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < omx->drv_ctx.op_buf.actualcount) {
823061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
823161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
823261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool status;
823361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
823461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pthread_mutex_lock(&omx->c_lock);
823561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
823661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer,pmem_fd[index],
823761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_baseaddress[index], pmem_baseaddress[index]);
823861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pthread_mutex_unlock(&omx->c_lock);
823961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
824061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!status) {
82418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed color conversion %d", status);
824261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr_client[index].nFilledLen = 0;
824361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return &m_out_mem_ptr_client[index];
824461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
824561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
824661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_mem_ptr_client[index].nFilledLen = 0;
82476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        return &m_out_mem_ptr_client[index];
824861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
82498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr");
825061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
82516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
825361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
825461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd)
82556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
825661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
82578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
825861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
825961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
826061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
826161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bufadd;
826261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned index = 0;
826361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufadd - m_out_mem_ptr_client;
826461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < omx->drv_ctx.op_buf.actualcount) {
826561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return &omx->m_out_mem_ptr[index];
826661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
82678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr");
82686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return NULL;
82696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
827061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool omx_vdec::allocate_color_convert_buf::get_buffer_req
827161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(unsigned int &buffer_size)
82726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
827361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
827461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
827561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
827661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_size = omx->drv_ctx.op_buf.buffer_size;
827761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
827861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
82798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Get buffer size failed");
828061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
828161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            goto fail_get_buffer_size;
828261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
828361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
828461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
82856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        buffer_size = omx->drv_ctx.op_buf.buffer_size;
828661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
828761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
82886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_get_buffer_size:
828961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
829061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
82916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82926eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
829361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *bufhdr)
829461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
829561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
829661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
829761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
829861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return omx->free_output_buffer(bufhdr);
829961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enabled && omx->is_component_secure())
830061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
830161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!allocated_count || !bufhdr) {
83028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr);
830361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
830461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
830561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufhdr - m_out_mem_ptr_client;
830661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index >= omx->drv_ctx.op_buf.actualcount) {
83078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer");
830861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
830961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
831061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_fd[index] > 0) {
831161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        munmap(pmem_baseaddress[index], buffer_size_req);
831261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(pmem_fd[index]);
831361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
831461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd[index] = -1;
83156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
831661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx->free_ion_memory(&op_buf_ion_info[index]);
8317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
831861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr[index].video_heap_ptr = NULL;
831961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocated_count > 0)
832061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocated_count--;
832161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
832261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocated_count = 0;
832361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!allocated_count) {
832461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&omx->c_lock);
832561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        c2d.close();
832661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        init_members();
832761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&omx->c_lock);
832861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
832961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
83306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
8331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
83326eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
833361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
83346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
833561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
833661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
833761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
833861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
833961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
834061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enabled && omx->is_component_secure()) {
83418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d",
834261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->is_component_secure());
834361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorUnsupportedSetting;
834461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
834561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!bufferHdr || bytes > buffer_size_req) {
83468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr);
83478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("color_convert buffer_size_req %d bytes %lu",
834861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_size_req,bytes);
834961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
835061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
835161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
83528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert");
835361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
835461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
835561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
835661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
835761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            port,appData,omx->drv_ctx.op_buf.buffer_size);
835861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
83598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Buffer allocation failed color_convert");
836061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
836161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
836261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
836361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->drv_ctx.op_buf.actualcount) {
83648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid header index %d",
836561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (temp_bufferHdr - omx->m_out_mem_ptr));
836661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorUndefined;
836761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
836861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int i = allocated_count;
83696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
837061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
837161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req,buffer_alignment_req,
837261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
837361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            0);
837461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
837561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (op_buf_ion_info[i].ion_device_fd < 0) {
83768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert");
837761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
837861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
837961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
838061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
838161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
838261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_baseaddress[i] == MAP_FAILED) {
83838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req);
838461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(pmem_fd[i]);
838561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        omx->free_ion_memory(&op_buf_ion_info[i]);
838661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
838761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
838861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr[i].video_heap_ptr = new VideoHeap (
838961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            op_buf_ion_info[i].ion_device_fd,buffer_size_req,
839061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
83916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
839261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
839361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info_client[i].offset = 0;
839461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
839561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
839661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list_client[i].nEntries = 1;
839761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
839861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
839961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
840061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nFilledLen = 0;
840161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nFlags = 0;
840261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
840361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
840461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
840561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
840661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
840761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pAppPrivate = appData;
840861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *bufferHdr = &m_out_mem_ptr_client[i];
84098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("IL client buffer header %p", *bufferHdr);
841061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocated_count++;
841161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
84126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
84136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
84146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::is_component_secure()
84156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
841661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return secure_mode;
84176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
84186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
84196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
84206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
842161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
842261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
842361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
842461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dest_color_format =  (OMX_COLOR_FORMATTYPE)
842561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
842661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
842761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
842861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
842961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
843061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
843161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
843261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dest_color_format = OMX_COLOR_FormatYUV420Planar;
843361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
843461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
84356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
8436