1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
28767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanCopyright (c) 2013-2014, 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 _ANDROID_
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "DivXDrmDecrypt.h"
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h>
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h>
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_HANDLE_QCOM 0x4F00
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_OFFSET_QCOM 0x4F01
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0"
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME_LEN 30
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1;
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0";
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1;
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output.yuv";
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile;
91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar ouputextradatafilename [] = "/data/extradata";
92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef VENUS_HEVC
958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEVICE_NAME "/dev/video/venus_dec"
968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else
978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEVICE_NAME "/dev/video/q6_dec"
988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_INPUT_ERROR DEFAULT_FPS
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE        0xC5000000
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE_MASK   0xFF000000
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_AP_SEQ_START_CODE       0x0F010000
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_PROFILE_MASK   0xF0
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE          0
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_MAIN_PROFILE            1
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_ADVANCE_PROFILE         3
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0
113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_MED_LEVEL  2
114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_LEN            4
115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_POS            8
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_A_POS            12
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_POS            24
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SEQ_LAYER_SIZE          36
1196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define POLL_TIMEOUT 0x7fffffff
120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/ion"
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
12561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanextern "C" {
12661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include<utils/Log.h>
12761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif//_ANDROID_
129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_4K 0x1000
1316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_1M 0x100000
1326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
1356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define EXTRADATA_IDX(__num_planes) (__num_planes  - 1)
136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA)
1388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint debug_level = PRIO_ERROR;
1408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input)
142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer;
14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pollfd pfd;
14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer v4l2_buf;
14761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event dqevent;
14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
15161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pfd.fd = omx->drv_ctx.video_driver_fd;
15261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
1538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: Async thread start");
15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (1) {
15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = poll(&pfd, 1, POLL_TIMEOUT);
15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc) {
1588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Poll timedout");
15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (rc < 0) {
1618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error while polling: %d", rc);
16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_msginfo vdec_msg;
16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.length = omx->drv_ctx.num_planes;
16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.m.planes = plane;
17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (uint64_t)v4l2_buf.timestamp.tv_usec;
17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (vdec_msg.msgdata.output_frame.len) {
17961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
1858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_msginfo vdec_msg;
19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.length = 1;
19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.m.planes = plane;
19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
19961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
20261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
20361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
20661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pfd.revents & POLLPRI) {
20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
20861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
21061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
21161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved");
21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
21561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
21761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT ) {
21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
21961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_INFO_CONFIG_CHANGED;
22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved");
22261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
22461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
22661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
22761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
22861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Flush Done Recieved");
23161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
23361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
23461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
23561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
23661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Flush Done Recieved");
23861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
24061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
24161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
24261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
2438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Close Done Recieved and async_message_thread Exited");
24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
24561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
24661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
24761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR;
24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("SYS Error Recieved");
25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
25361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
25461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
2558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Some Event recieved");
25661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                continue;
25761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
25861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
25961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop");
26161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input)
265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
26761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char id;
26861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int n;
26961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx == NULL) {
2708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("message thread null pointer rxd");
27161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
27261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: message thread start");
27561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
27661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (1) {
277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
27861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        n = read(omx->m_pipe_in, &id, 1);
279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
28061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (0 == n) {
28161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
28261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
28461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (1 == n) {
28561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->process_event_cb(omx, id);
28661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
28761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((n < 0) && (errno != EINTR)) {
2888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno);
28961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
29061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: message thread stop");
29361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id)
297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
29861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret_value;
2996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
30061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx == NULL) {
3018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("message thread null pointer rxd");
30261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
30361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
3048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out);
30561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret_value = write(omx->m_pipe_out, &id, 1);
3068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value);
307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor
310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue()
311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
31261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Nothing to do
313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor
316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    memset(m_q,0,sizeof(m_q));
319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert
322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].id       = id;
32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].param1   = p1;
32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].param2   = p2;
32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_write++;
33061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_size ++;
33161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
33261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_write = 0;
33361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
33461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
3368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__);
33761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
33861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop
342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_size > 0) {
34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *id = m_q[m_read].id;
34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *p1 = m_q[m_read].param1;
34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *p2 = m_q[m_read].param2;
34961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Move the read pointer ahead
35061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ++m_read;
35161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        --m_size;
35261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
35361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_read = 0;
35461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
35561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
35661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
35761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
35861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue
362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return m_q[m_read].id;
365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list()
369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
37061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //initialize timestamps array
37161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_ts_arr_list, 0, sizeof(m_ts_arr_list) );
372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list()
374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
37561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //free m_ts_arr_list?
376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
38161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool duplicate_ts = false;
38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
38361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //insert at the first available empty location
38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_ts_arr_list[idx].valid) {
38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //found invalid or empty entry, save timestamp
38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_ts_arr_list[idx].valid = true;
38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_ts_arr_list[idx].timestamp = ts;
39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
39161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ts, idx);
39261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
39361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
39461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
39561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
39661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
39761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
39861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
39961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
40061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int min_idx = -1;
40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_TICKS min_ts = 0;
40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_ts_arr_list[idx].valid) {
41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //found valid entry, save index
41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (min_idx < 0) {
41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //first valid entry
41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_ts = m_ts_arr_list[idx].timestamp;
41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_idx = idx;
41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (m_ts_arr_list[idx].timestamp < min_ts) {
41961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_ts = m_ts_arr_list[idx].timestamp;
42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_idx = idx;
42161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
42261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
42361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
42461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
42561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (min_idx < 0) {
42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //no valid entries found
42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ts = 0;
43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
43261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ts = m_ts_arr_list[min_idx].timestamp;
43361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ts_arr_list[min_idx].valid = false;
43461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
43561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ts, min_idx);
43661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
43761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
43861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list()
444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
44561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
44661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
44761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
44861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
44961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
45061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ts_arr_list[idx].valid = false;
45161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
45261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances
457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void)
458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
45961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return (new omx_vdec);
460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
46561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct ion_handle *handle, int ionMapfd)
466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
46761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base)
471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // dup file descriptor, map once, use pmem
473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    init(dup(fd), base, size, 0 , MEM_DEVICE);
474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_
477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::omx_vdec
480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Constructor
483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
48561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None
486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
48861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::omx_vdec(): m_error_propogated(false),
49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_state(OMX_StateInvalid),
49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_app_data(NULL),
49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_mem_ptr(NULL),
49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr(NULL),
49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_err_count(0),
49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_flush_progress (false),
49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_flush_progress (false),
49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_use_buffer (false),
49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_use_buffer (false),
50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers(false),
50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_use_output_pmem(OMX_FALSE),
50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_region_smi(OMX_FALSE),
50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_pvt_entry_pmem(OMX_FALSE),
50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_input_buffers(0),
50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers(0),
50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bm_count(0),
50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bm_count(0),
50861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bPopulated(OMX_FALSE),
50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bPopulated(OMX_FALSE),
51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_flags(0),
511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr(NULL),
513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bEnabled(OMX_TRUE),
51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bEnabled(OMX_TRUE),
51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_in_alloc_cnt(0),
51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list(NULL),
51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry(NULL),
51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info(NULL),
52061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    arbitrary_bytes (true),
52161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    psource_frame (NULL),
52261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pdest_frame (NULL),
52361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_heap_ptr (NULL),
52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_phdr_pmem_ptr(NULL),
52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_inp_bm_count (0),
52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    codec_type_parse ((codec_type)0),
52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame_meta (true),
52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_count (0),
52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nal_count (0),
53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nal_length(0),
53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    look_ahead_nal (false),
53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame(0),
53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_buffer(NULL),
53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame_size (0),
53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_device_file_ptr(NULL),
53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_vc1_profile((vc1_profile_type)0),
53761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_last_au_ts(LLONG_MAX),
53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_last_au_flags(0),
53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prev_ts(LLONG_MAX),
54061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rst_prev_ts(true),
54161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frm_int(0),
54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    in_reconfig(false),
54361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_display_id(NULL),
54461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_parser(NULL),
54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    client_extradata(0),
546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
54761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_enable_android_native_buffers(OMX_FALSE),
54861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_use_android_native_buffers(OMX_FALSE),
54961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    iDivXDrmDecrypt(NULL),
550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
55161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_desc_buffer_ptr(NULL),
55261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    secure_mode(false)
553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
55461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Assumption is that , to begin with , we have all the frames with decoder */
55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
55761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char property_value[PROPERTY_VALUE_MAX] = {0};
5588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.debug.level", property_value, "1");
5598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    debug_level = atoi(property_value);
5608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
5618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.perf", property_value, "0");
56361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    perf_flag = atoi(property_value);
56461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
56561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dec_time.start();
56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        proc_frms = latency = 0;
56861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_value[0] = '\0';
57061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.ts", property_value, "0");
57161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_timestamp = atoi(property_value);
57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
57461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.set_timestamp_reorder_mode(true);
57561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.enable_debug_print(true);
57661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
57861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_value[0] = '\0';
57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.concealedmb", property_value, "0");
58061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_concealedmb = atoi(property_value);
58161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
58461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_cmp,0,sizeof(m_cmp));
58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_cb,0,sizeof(m_cb));
58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&drv_ctx,0,sizeof(drv_ctx));
58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
58961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_demux_offsets, 0, sizeof(m_demux_offsets) );
59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
5916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_
59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
5936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.timestamp_adjust = false;
59661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.video_driver_fd = -1;
59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_vendor_config.pData = NULL;
59861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&m_lock, NULL);
59961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&c_lock, NULL);
60061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    sem_init(&m_cmd_lock,0,0);
60161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    streaming[CAPTURE_PORT] =
60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        streaming[OUTPUT_PORT] = false;
603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char extradata_value[PROPERTY_VALUE_MAX] = {0};
60561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.extradata", extradata_value, "0");
60661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_extradata = atoi(extradata_value);
60761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
60961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
61061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    client_buffers.set_vdec_client(this);
6116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
6126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
6136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic const int event_type[] = {
61461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
61761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_SYS_ERROR
6196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal};
6206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
6216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE subscribe_to_events(int fd)
6226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
6288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
63061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
6378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type);
63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
64061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < array_sz) {
64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (--i; i >=0 ; i--) {
64361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(&sub, 0, sizeof(sub));
64461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sub.type = event_type[i];
64561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
64661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc)
6478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
64861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
64961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorNotImplemented;
65061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
65161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE unsubscribe_to_events(int fd)
6566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
66061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
6628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
66361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
66461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
66561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
66661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
66861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
66961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
67061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
6718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
67461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
6766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
6776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
67961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
68061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::~omx_vdec
681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Destructor
684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
68561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None
687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec()
692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info = NULL;
69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_decoder_cmd dec;
69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("In OMX vdec Destructor");
69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_pipe_in) close(m_pipe_in);
69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_pipe_out) close(m_pipe_out);
69861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pipe_in = -1;
69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pipe_out = -1;
70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_join(msg_thread_id,NULL);
70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
70361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dec.cmd = V4L2_DEC_CMD_STOP;
70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
7058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("STOP Command failed");
70661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_join(async_thread_id,NULL);
70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsubscribe_to_events(drv_ctx.video_driver_fd);
70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    close(drv_ctx.video_driver_fd);
71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_destroy(&m_lock);
71161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_destroy(&c_lock);
71261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    sem_destroy(&m_cmd_lock);
71361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
71461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
71561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dec_time.end();
71661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
71761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
72061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
72361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
72461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
72561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
72661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.count = 0;
72761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
72961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
73061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
7316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
7326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
73461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::OMXCntrlProcessMsgCb
736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
73761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL Client callbacks are generated through this routine. The decoder
73961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   provides the thread context for this routine.
740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ctxt -- Context information related to the self.
74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   id   -- Event identifier. This could be any of the following:
74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   1. Command completion event
74561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   2. Buffer done callback event
74661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   3. Frame done callback event
747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
75461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    signed int p1; // Parameter - 1
75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    signed int p2; // Parameter - 2
75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int ident;
75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int qsize=0; // qsize
75861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec *pThis = (omx_vdec *) ctxt;
75961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!pThis) {
7618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out",
76261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__);
76361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
76661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Protect the shared queue data structure
76761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    do {
76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Read the message id's from the queue*/
76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&pThis->m_lock);
77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qsize = pThis->m_cmd_q.m_size;
77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize) {
77261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize = pThis->m_ftb_q.m_size;
77761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (qsize) {
77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
78061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize = pThis->m_etb_q.m_size;
78461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (qsize) {
78561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
78861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&pThis->m_lock);
78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*process message if we have one*/
79161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize > 0) {
79261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id = ident;
79361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch (id) {
79461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT:
79561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
79661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        switch (p1) {
79761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandStateSet:
79861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = (OMX_STATETYPE) p2;
7998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d",
80061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->m_state);
80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
80261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL);
80361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
80461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
80561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_EventError:
80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (p2 == OMX_StateInvalid) {
8078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid");
80861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_state = (OMX_STATETYPE) p2;
80961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else if (p2 == OMX_ErrorHardware) {
81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->omx_report_error();
81361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else {
81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventError, p2, (OMX_U32)NULL, NULL );
81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
81861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
81961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandPortDisable:
8208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%d]", p2);
82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
82361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    break;
82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig) {
82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    OMX_ERRORTYPE eRet = OMX_ErrorNone;
82861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
8308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("Failed to release output buffers");
83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->in_reconfig = false;
83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (eRet !=  OMX_ErrorNone) {
83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error();
83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandPortEnable:
8438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%d]", p2);
84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            default:
84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
85361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
85461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
8558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
8618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure");
86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_ETB:
86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
8688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure");
86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_FTB:
87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
8768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure");
87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
88161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_COMMAND:
88261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (OMX_U32)p2,(OMX_PTR)NULL);
88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EBD:
88761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
8898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure");
89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
89161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_inp_err_count++;
89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->time_stamp_dts.remove_time_stamp(
89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
89661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ?true:false);
89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_inp_err_count = 0;
90061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
90161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ( pThis->empty_buffer_done(&pThis->m_cmp,
90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
9038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("empty_buffer_done failure");
90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
90561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_inp_err_count >= MAX_INPUT_ERROR) {
9078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    {
91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        int64_t *timestamp = (int64_t *)p1;
91561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p1) {
91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->time_stamp_dts.remove_time_stamp(*timestamp,
91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ?true:false);
91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            free(timestamp);
92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_FBD:
92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 != VDEC_S_SUCCESS) {
9258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure");
92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
92761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
92861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
9298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("fill_buffer_done failure");
93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
9358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Driver flush i/p Port complete");
93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!pThis->input_flush_progress) {
9378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->execute_input_flush();
94061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (p2 != VDEC_S_SUCCESS) {
9428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->omx_report_error ();
94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else {
94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                /*Check if we need generate event for Flush done*/
94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
94761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
9498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_LOW("Input Flush completed - Notify Client");
95061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventCmdComplete,OMX_CommandFlush,
95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_CORE_INPUT_PORT_INDEX,NULL );
95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
95561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_IDLE_PENDING)) {
95661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
9578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port");
95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error ();
95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    } else {
96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->streaming[OUTPUT_PORT] = false;
96161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (!pThis->output_flush_progress) {
9638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_LOW("Input flush done hence issue stop");
96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_GENERATE_STOP_DONE);
96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
96961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
97161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
97461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
9768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Driver flush o/p Port complete");
97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!pThis->output_flush_progress) {
9788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->execute_output_flush();
98161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
98261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (p2 != VDEC_S_SUCCESS) {
9838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->omx_report_error ();
98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else {
98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                /*Check if we need generate event for Flush done*/
98761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
9898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_LOW("Notify Output Flush done");
99061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventCmdComplete,OMX_CommandFlush,
99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_CORE_OUTPUT_PORT_INDEX,NULL );
99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
99561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
9978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_LOW("Internal flush complete");
99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,
99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (BITMASK_PRESENT(&pThis->m_flags,
100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
100261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->post_event(OMX_CommandPortDisable,
100361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_CORE_OUTPUT_PORT_INDEX,
100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_GENERATE_EVENT);
100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        BITMASK_CLEAR (&pThis->m_flags,
100661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
100761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
101161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
101261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
10138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port");
101461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error ();
101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
101761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->streaming[CAPTURE_PORT] = false;
101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (!pThis->input_flush_progress) {
10198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_LOW("Output flush done hence issue stop");
102061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_GENERATE_STOP_DONE);
102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
102961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
103061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_START_DONE:
10328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE");
103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
103461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
10368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure");
103761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
10398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success");
104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
10418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("Move to executing");
104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                // Send the callback now
104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StateExecuting;
104561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StateExecuting, NULL);
104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else if (BITMASK_PRESENT(&pThis->m_flags,
104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_COMPONENT_PAUSE_PENDING)) {
105061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (/*ioctl (pThis->drv_ctx.video_driver_fd,
105161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) {
10528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed");
105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->omx_report_error ();
105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
105661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
10588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("Event Handler callback is NULL");
105961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
106161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_PAUSE_DONE:
10638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
106961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->complete_pending_buffer_done_cbs();
107061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
10718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                //Send the callback now
107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StatePause;
107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
107761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StatePause, NULL);
107861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
108061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
108161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
108261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
108361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
108561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_RESUME_DONE:
10878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
108861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
10908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed");
109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
10948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("Moving the decoder to execute state");
109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                // Send the callback now
109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StateExecuting;
109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StateExecuting,NULL);
110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
110361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_STOP_DONE:
11108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
111161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
11138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->complete_pending_buffer_done_cbs();
111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
11188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success");
111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                // Send the callback now
112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StateIdle;
11228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("Move to Idle State");
112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StateIdle,NULL);
112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
113361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
11358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 == OMX_IndexParamPortDefinition) {
113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->in_reconfig = true;
113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_EventPortSettingsChanged, p1, p2, NULL );
114361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
114461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
114561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) {
114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            format = OMX_InterlaceInterleaveFrameTopFieldFirst;
115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        else //unsupported interlace format; raise a error
115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            event = OMX_EventError;
115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    event, format, 0, NULL );
115961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
116261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
116361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
116461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
116561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EOS_DONE:
11668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
117161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
117261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->prev_ts = LLONG_MAX;
117461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->rst_prev_ts = true;
117561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
117661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
117761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
11788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
117961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->omx_report_error ();
118061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
118161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
118261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    {
11838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
118461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
118561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
118661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
118761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
118861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
118961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
119061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
119161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
119261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
119361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
119561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&pThis->m_lock);
119661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qsize = pThis->m_cmd_q.m_size;
119761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pThis->m_state != OMX_StatePause)
119861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
119961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&pThis->m_lock);
120061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } while (qsize>0);
1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
12046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::update_resolution(int width, int height)
12056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
12066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.frame_height = height;
12076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.frame_width = width;
12086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.scan_lines = height;
12096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.stride = width;
12106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nLeft = 0;
12116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nTop = 0;
12126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nWidth = drv_ctx.video_resolution.frame_width;
12136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nHeight = drv_ctx.video_resolution.frame_height;
12146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
1215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
121761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
121861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentInit
1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
122061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
122161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Initialize the component.
1222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
122361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ctxt -- Context information related to the self.
122561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   id   -- Event identifier. This could be any of the following:
122661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   1. Command completion event
122761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   2. Buffer done callback event
122861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   3. Frame done callback event
1229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
123061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
123361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
1235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_fmtdesc fdesc;
123961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
124061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int   alignment = 0,buffer_size = 0;
124361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fds[2];
124461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int r,ret=0;
124561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool codec_ambiguous = false;
12468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_STRING device_name = (OMX_STRING)DEVICE_NAME;
12478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Opening device %s", device_name);
124861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.video_driver_fd = open(device_name, O_RDWR);
124961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
12508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec::component_init(): Open device %s returned fd %d, errno %d",
125161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            device_name, drv_ctx.video_driver_fd, errno);
125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
125361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.video_driver_fd == 0) {
125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.video_driver_fd = open(device_name, O_RDWR);
125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
125661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
125761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.video_driver_fd < 0) {
12588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno);
125961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
126061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
126161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
126261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.frame_rate.fps_denominator = 1;
1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
12646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    ret = pthread_create(&async_thread_id,0,async_message_thread,this);
126561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret < 0) {
126661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(drv_ctx.video_driver_fd);
12678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to create async_message_thread");
126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
126961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
127261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
1273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
127561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    outputBufferFile1 = fopen (outputfilename, "ab");
1276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
127861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    outputExtradataFile = fopen (ouputextradatafilename, "ab");
1279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
128161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Copy the role information which provides the decoder kind
128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    strlcpy(drv_ctx.kind,role,128);
128361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
128461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE);
128861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.timestamp_adjust = true;
128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
129061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingMPEG4;
129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_MPEG4;
129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Initialize Start Code for MPEG4*/
129361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_MPEG4;
129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
129661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "m4v");
1297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE);
130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_MPEG2;
130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingMPEG2;
130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Initialize Start Code for MPEG2*/
130661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_MPEG2;
130761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "mpg");
1310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
13148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("H263 Decoder selected");
131561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingH263;
131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_H263;
131861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_H263;
131961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "263");
1322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
132461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
132561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
13268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW ("DIVX 311 Decoder selected");
132761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
132861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX_311;
132961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = createDivxDrmContext();
133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet != OMX_ErrorNone) {
133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return eRet;
133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
133961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
13418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected");
134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX;
134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_ambiguous = true;
134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
134861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = createDivxDrmContext();
135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet != OMX_ErrorNone) {
135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return eRet;
135361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
13578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected");
135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
135961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX;
136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_ambiguous = true;
136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = createDivxDrmContext();
136661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet != OMX_ErrorNone) {
136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
136861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return eRet;
136961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
137161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_H264;
137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingAVC;
137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_H264;
137861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "264");
1382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\
138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC;
138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_HEVC;
138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc;
138961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_HEVC;
139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
139161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
13926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef INPUT_BUFFER_LOG
139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "265");
13946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
139861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
139961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingWMV;
140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VC1;
140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
140261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "vc1");
1405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
140961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingWMV;
141161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VC1;
141261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
141361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
141561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "vc1");
1416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
141761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",\
141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_VP8;
14215aa03230fef7a43a61e1ac5f19a2c5a71e5d6df7Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingVP8;
142261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VP8;
142361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        arbitrary_bytes = false;
142461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
14258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Unknown Component");
142661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInvalidComponentName;
142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    inputBufferFile1 = fopen (inputfilename, "ab");
1430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
1432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
143361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
14346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
14356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
14366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        if (!client_buffers.set_color_format(dest_color_format)) {
14378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Setting color format failed");
14386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            eRet = OMX_ErrorInsufficientResources;
14396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
1440dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        capture_capability= V4L2_PIX_FMT_NV12;
144261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = subscribe_to_events(drv_ctx.video_driver_fd);
144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
14448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Subscribe Event Failed");
144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
144761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
144861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_capability cap;
144961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
14518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to query capabilities");
145261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
145361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
14558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    " version = %d, capabilities = %x", cap.driver, cap.card,
145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    cap.bus_info, cap.version, cap.capabilities);
145761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
145861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret=0;
145961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
146061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.index=0;
146161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
14628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
146361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fdesc.pixelformat, fdesc.flags);
146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fdesc.index++;
146561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
146661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.index=0;
146861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
14708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fdesc.pixelformat, fdesc.flags);
147261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fdesc.index++;
147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
14746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        update_resolution(320, 240);
147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
147761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
147961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
148061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
148161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
14828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set format on output port");
148361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
14848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set Format was successful");
148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_ambiguous) {
148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (output_capability == V4L2_PIX_FMT_DIVX) {
148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control divx_ctrl;
148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
149461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
149561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
149661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
149761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (ret) {
15008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Failed to set divx version");
150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Codec should not be ambiguous");
150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
151261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
15148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set format on capture port");
151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
15168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set Format was successful");
151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode) {
151861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = 1;
15208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret);
152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ret) {
15238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret);
152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(drv_ctx.video_driver_fd);
152561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
152961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Get the Buffer requirements for input and output ports*/
153061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
153161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
153261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode) {
153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.op_buf.alignment=SZ_1M;
153461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf.alignment=SZ_1M;
153561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
153661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.op_buf.alignment=SZ_4K;
153761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf.alignment=SZ_4K;
153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
154061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata = 0;
154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
154561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.idr_only_decoding = 0;
1546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
15476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        m_state = OMX_StateLoaded;
1548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA
15496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        if (eRet == OMX_ErrorNone && !secure_mode)
15506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            enable_extradata(DEFAULT_EXTRADATA, true, true);
1551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
15526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        eRet=get_buffer_req(&drv_ctx.ip_buf);
15538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Input Buffer Size =%d",drv_ctx.ip_buf.buffer_size);
15546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        get_buffer_req(&drv_ctx.op_buf);
155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC) {
155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFilledLen = 0;
156061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nOffset = 0;
156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.pBuffer == NULL) {
15638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed ");
156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
156561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
156661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
156861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
156961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_frame_parser.mutils == NULL) {
157061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_frame_parser.mutils = new H264_Utils();
157161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
157261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_frame_parser.mutils == NULL) {
15738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("parser utils Allocation failed ");
157461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorInsufficientResources;
157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_frame_parser.mutils->initialize_frame_checking_environment();
157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
157861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
158061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_parser = new h264_stream_parser();
158261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!h264_parser) {
158361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
158461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
158561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
158661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
158761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pipe(fds)) {
15898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("pipe creation failed");
159061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
159161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
159261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int temp1[2];
159361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (fds[0] == 0 || fds[1] == 0) {
159461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pipe (temp1)) {
15958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("pipe creation failed");
159661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
15976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                }
159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //close (fds[0]);
159961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //close (fds[1]);
160061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fds[0] = temp1 [0];
160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fds[1] = temp1 [1];
160261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pipe_in = fds[0];
160461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pipe_out = fds[1];
160561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            r = pthread_create(&msg_thread_id,0,message_thread,this);
160661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (r < 0) {
16088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("component_init(): message_thread creation failed");
160961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
161161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
161261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
16136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
161461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet != OMX_ErrorNone) {
16158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Component Init Failed");
16168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Calling VDEC_IOCTL_STOP_NEXT_MSG");
161761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
161861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                NULL);
16198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Calling close() on Video Driver");
162061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close (drv_ctx.video_driver_fd);
162161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.video_driver_fd = -1;
162261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
16238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("omx_vdec::component_init() success");
162461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
162561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
162661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
163061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
163161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetComponentVersion
1632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
163361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
163461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns the component version.
1635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
163661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
163761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   TBD.
1638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
163961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
164061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX_ErrorNone.
1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
164261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_component_version
164461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(
164561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp,
164661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STRING componentName,
164761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* componentVersion,
164861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* specVersion,
164961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_UUIDTYPE* componentUUID
165061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan )
1651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
165261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
16538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State");
1654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
1655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* TBD -- Return the proper version */
165761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (specVersion) {
165861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        specVersion->nVersion = OMX_SPEC_VERSION;
165961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
166061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
1661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
166361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
166461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommand
1665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
166661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
166761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
1668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
166961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
167061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
167261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
167361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
167561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_COMMANDTYPE cmd,
167861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32 param1,
167961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR cmdData
168061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
1681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
16828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command: Recieved a Command from Client");
168361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
16848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State");
1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
1686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
168861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
16898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush "
169061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "to invalid port: %lu", param1);
169161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
1692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
1694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sem_wait(&m_cmd_lock);
16958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command: Command Processed");
1696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
1697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
170061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
170161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommand
1702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
170361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
170461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
1705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
170661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
1711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_COMMANDTYPE cmd,
171561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32 param1,
171661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR cmdData
171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
1718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
172061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int bFlag = 1,sem_posted = 0,ret=0;
172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd);
17248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d",
172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_state, eState);
172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
172761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (cmd == OMX_CommandStateSet) {
17288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued");
17298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState);
173061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
173161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Loaded */
173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
173361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_state == OMX_StateLoaded) {
173461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateIdle) {
173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //if all buffers are allocated or all ports disabled
173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (allocate_done() ||
173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
17388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle");
173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
17408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending");
174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // Skip the event notification
174361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
174461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
174561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
174661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Loaded */
174761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
17488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded");
174961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
175161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
175261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
175361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to WaitForResources */
175461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
175561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
17578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources");
175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
175961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Executing */
176061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
17618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing");
176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
176561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
176661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Pause */
176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
17688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause");
176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
177261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
177361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Invalid */
177461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
17758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid");
177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
177761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
17798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\
178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eState);
178161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
178261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
178461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
178561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
178661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is IDLE */
178761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
178861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateIdle) {
178961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateLoaded) {
179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (release_done()) {
179161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    /*
179261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       Since error is None , we will post an event at the end
179361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       of this function definition
179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     */
17958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded");
179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
17978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending");
179861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
179961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // Skip the event notification
180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
180261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
180361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Executing */
180461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
18058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
180661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
180761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
18088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
180961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state=OMX_StateExecuting;
18108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful");
181161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
181261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Idle */
181361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateIdle) {
18148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle");
181561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
181661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
181761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
181861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
181961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to WaitForResources */
182061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
18218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources");
182261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
182361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
182461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
182561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
182661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Pause */
182761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
182861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*To pause the Video core we need to start the driver*/
182961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
183061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      NULL) < */0) {
18318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED");
183261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
183361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorHardware;
183461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
183561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
18368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause");
183761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
183861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
183961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
184061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Invalid */
184161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
18428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid");
184361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
184461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
184561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
18468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState);
184761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
184861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1849dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
1850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
185161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /******************************/
185261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Executing */
185361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /******************************/
185461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateExecuting) {
18558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting");
185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Idle */
185761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateIdle) {
185861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
185961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition
186061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 */
18618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle");
186261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
186361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!sem_posted) {
186461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_posted = 1;
186561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_post (&m_cmd_lock);
186661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_ALL);
186761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
186861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
186961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
187061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Paused */
187161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
18728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("PAUSE Command Issued");
187361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state = OMX_StatePause;
187461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
187561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
187661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Loaded */
187761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
18788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded");
187961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
188061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
188161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
188261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
188361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to WaitForResources */
188461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
18858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources");
188661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
188761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
188861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
188961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
189061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Executing */
189161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
18928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing");
189361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
189461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
189561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
189661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
189761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Invalid */
189861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
18998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid");
190061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
190161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
190261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
19038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState);
190461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
190561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
190661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
190761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
190861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Pause  */
190961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
191061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StatePause) {
191161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Executing */
191261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateExecuting) {
19138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pause --> Executing");
191461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state = OMX_StateExecuting;
191561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
191661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
191761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Idle */
191861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateIdle) {
191961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
192061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
19218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pause --> Idle");
192261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
192361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!sem_posted) {
192461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_posted = 1;
192561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_post (&m_cmd_lock);
192661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_ALL);
192761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
192861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
192961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
193061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to loaded */
193161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
19328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> loaded");
193361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
193461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
193561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
193661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
193761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to WaitForResources */
193861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
19398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> WaitForResources");
194061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
194161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
194261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
194361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
194461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Pause */
194561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
19468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> Pause");
194761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
194861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
194961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
195061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
195161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Invalid */
195261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
19538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> Invalid");
195461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
195561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
195661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
19578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState);
195861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
195961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
196061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
196161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
196261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is WaitForResources  */
196361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
196461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateWaitForResources) {
196561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Loaded */
196661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateLoaded) {
196761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
196861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
19698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded");
197061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
197161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to WaitForResources */
197261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
19738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources");
197461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,
197561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
197661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
197761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
197861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Executing */
197961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
19808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing");
198161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
198261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
198361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
198461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
198561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Pause */
198661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
19878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause");
198861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
198961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
199161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
199261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Invalid */
199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
19948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid");
199561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
199761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Loaded -
199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan               is NOT tested by Khronos TS */
200061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
20028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState);
200361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
200461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
2005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /********************************/
200761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Current State is Invalid */
200861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*******************************/
200961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (m_state == OMX_StateInvalid) {
201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* State Transition from Inavlid to any state */
201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
201261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || OMX_StateIdle || OMX_StateExecuting
201361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || OMX_StatePause || OMX_StateInvalid)) {
20148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded");
201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_EventError,OMX_ErrorInvalidState,\
201661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInvalidState;
2018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (cmd == OMX_CommandFlush) {
20208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued"
202161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "with param1: %lu", param1);
202261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
202361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
202461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
202561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
202861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!sem_posted) {
202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sem_posted = 1;
20308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Set the Semaphore");
203161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sem_post (&m_cmd_lock);
203261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            execute_omx_flush(param1);
203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
203461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bFlag = 0;
203561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ( cmd == OMX_CommandPortEnable) {
20368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued"
203761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "with param1: %lu", param1);
203861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
203961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bEnabled = OMX_TRUE;
204061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
204161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( (m_state == OMX_StateLoaded &&
204261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
204361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || allocate_input_done()) {
204461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
204561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
204661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
20478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
204861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
204961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
205061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
205161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
205261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
205361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
20548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Enable output Port command recieved");
205561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bEnabled = OMX_TRUE;
205661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( (m_state == OMX_StateLoaded &&
205861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
205961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || (allocate_output_done())) {
206061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
2061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
2062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
206361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
20648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
206561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
206661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
206761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
206861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
206961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (cmd == OMX_CommandPortDisable) {
20718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued"
207261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "with param1: %lu", param1);
207361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
207461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bEnabled = OMX_FALSE;
207561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
207661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    && release_input_done()) {
207761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
2078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
207961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
208061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
208161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
208261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!sem_posted) {
208361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_posted = 1;
208461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_post (&m_cmd_lock);
208561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
208661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
208761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
208861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
208961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
209061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
209161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
209261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
209361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
209461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bEnabled = OMX_FALSE;
20958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Disable output Port command recieved");
209661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
209761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    && release_output_done()) {
209861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
2099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
210061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
210161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!sem_posted) {
210461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_posted = 1;
210561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_post (&m_cmd_lock);
210661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
210961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
211261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
211361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
211461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
211561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
21168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd);
211761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorNotImplemented;
211861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone && bFlag) {
212061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
212161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!sem_posted) {
212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sem_post(&m_cmd_lock);
212461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
212561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
212661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
213061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
213161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ExecuteOmxFlush
2132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
213361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Executes the OMX flush.
2135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
213661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   flushtype - input flush(1)/output flush(0)/ both.
2138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
213961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
2141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
214261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType)
2144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
214661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane;
214761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer v4l2_buf;
214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_decoder_cmd dec;
214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("in %s", __func__);
215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
215161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
215261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (flushType) {
215361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_CORE_INPUT_PORT_INDEX:
215461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input_flush_progress = true;
215561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT;
215661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
215761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_CORE_OUTPUT_PORT_INDEX:
215861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            output_flush_progress = true;
215961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
216061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
216161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
216261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input_flush_progress = true;
216361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            output_flush_progress = true;
216461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT |
216561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
216661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
216761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
216861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
21698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Flush Port (%lu) Failed ", flushType);
217061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = false;
217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
217261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
217361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
2176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush
2177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
217961a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at OUTPUT PORT.
2180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
218261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone.
2183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
218561a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false
2186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
2187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush()
2188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p1 = 0; // Parameter - 1
219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p2 = 0; // Parameter - 2
219161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      ident = 0;
219261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = true;
219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
219461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Generate FBD for all Buffers in the FTBq*/
219561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
21968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Initiate Output Flush");
219761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_ftb_q.m_size) {
21988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer queue size %d pending buf cnt %d",
219961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_ftb_q.m_size,pending_output_buffers);
220061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.pop_entry(&p1,&p2,&ident);
22018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("ID(%x) P1(%x) P2(%x)", ident, p1, p2);
220261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == m_fill_output_msg ) {
220361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
220461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
220561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
220661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
220761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
220861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
220961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_flush_progress = false;
221061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
221161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
221261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = LLONG_MAX;
221361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
221461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
22158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
221661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
2219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush
2220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
222261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at INPUT PORT.
2223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
222561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone.
2226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
222861a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false
2229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
2230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush()
2231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
223261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned       i =0;
223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p1 = 0; // Parameter - 1
223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p2 = 0; // Parameter - 2
223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      ident = 0;
223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = true;
223761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Generate EBD for all Buffers in the ETBq*/
22398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Initiate Input Flush");
224061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
22428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Check if the Queue is empty");
224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_etb_q.m_size) {
224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.pop_entry(&p1,&p2,&ident);
224561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
22478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
224961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
225061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_input_buffers++;
22518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
225361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
225461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
22558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p",
225661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p1);
225761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
225861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
225961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
226061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    time_stamp_dts.flush_timestamp();
226161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Check if Heap Buffers are to be flushed*/
22628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (arbitrary_bytes && !(codec_config_flag)) {
22638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Reset all the variables before flusing");
226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_scratch.nFilledLen = 0;
226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_count = 0;
226661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_count = 0;
226861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_ts = LLONG_MAX;
226961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_flags = 0;
227061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
227161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_entries = 0;
22728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Initialize parser");
227361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils) {
227461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils->initialize_frame_checking_environment();
227561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
227661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
227761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (m_input_pending_q.m_size) {
227861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&p1,&p2,&ident);
227961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
228061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
228161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
228261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame) {
228361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
228461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
228561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
228661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
228761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame) {
228861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFilledLen = 0;
228961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL,
229061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned int)NULL);
229161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = NULL;
229261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
229361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.flush();
22948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (codec_config_flag) {
22958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
22968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "is not sent to the driver yet");
229761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
229861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
229961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_flush_progress = false;
230061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes) {
230161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = LLONG_MAX;
230261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
230661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_timestamp_list.reset_ts_list();
230761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
23098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
231061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
231561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
231661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommandEvent
2317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
231861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
231961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Send the event to decoder pipe.  This is needed to generate the callbacks
232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   in decoder thread context.
2321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
232361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
2324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
232661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
2327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::post_event(unsigned int p1,
233061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int p2,
233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int id)
2332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
233361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet      =                      false;
233461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
233761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (id == m_fill_output_msg ||
233961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_FBD) {
234061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.insert_entry(p1,p2,id);
234161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (id == OMX_COMPONENT_GENERATE_ETB ||
234261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_EBD ||
234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.insert_entry(p1,p2,id);
234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
234661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cmd_q.insert_entry(p1,p2,id);
234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
234861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet = true;
23508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this);
235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    post_message(this, id);
235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
235361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
235461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
235561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
2359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
236061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNoMore;
236161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!profileLevelType)
236261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (profileLevelType->nPortIndex == 0) {
236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
236661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
236761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
237061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 2) {
237461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
237561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
23778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d",
237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        profileLevelType->nProfileIndex);
237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
238161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
238261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // TODO
238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
23848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d",
238561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        profileLevelType->nProfileIndex);
238661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
238961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
239161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
239261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
23938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
239461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
239561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
239661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
239761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
239861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
239961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
240061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
240261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
240361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
24048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
240561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
240661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
240761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
240861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
240961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
241061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
241161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
241261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
241361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
241461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
241561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
24178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
241861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
241961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
242061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
242161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
24228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu", profileLevelType->nPortIndex);
242361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
242461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
242561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
242961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
243061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetParameter
2431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
243261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
243361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Get Parameter method implementation
2434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
243561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
243661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
2437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
243861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
243961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Error None if successful.
2440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
244361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE paramIndex,
244461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_PTR     paramData)
2445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
24488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_parameter:");
244961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
24508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Param in Invalid State");
2451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
245361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (paramData == NULL) {
24548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Get Param in Invalid paramData");
2455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
245761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)paramIndex) {
245861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition:
245961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
246061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
246161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
24628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition");
246361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = update_portdef(portDefn);
246461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (eRet == OMX_ErrorNone)
246561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_port_def = *portDefn;
246661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
246761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
246861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoInit:
246961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
247061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PORT_PARAM_TYPE *portParamType =
247161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PORT_PARAM_TYPE *) paramData;
24728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit");
247361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
247461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
247561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nSize = sizeof(portParamType);
247661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nPorts           = 2;
247761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nStartPortNumber = 0;
247861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
247961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
248061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat:
248161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
248261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
24848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat");
248561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portFmt->nSize             = sizeof(portFmt);
248861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (0 == portFmt->nPortIndex) {
249061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (0 == portFmt->nIndex) {
249161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
249261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eCompressionFormat = eCompressionFormat;
249361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
249461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
24958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                " NoMore compression formats");
249661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =  OMX_ErrorNoMore;
249761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
249861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (1 == portFmt->nPortIndex) {
249961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
250061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
250161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (0 == portFmt->nIndex)
250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else if (1 == portFmt->nIndex)
250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
250661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else {
250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
25088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                " NoMore Color formats");
250961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =  OMX_ErrorNoMore;
251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
25118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("returning %d", portFmt->eColorFormat);
251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
25138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("get_parameter: Bad port index %d",
251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (int)portFmt->nPortIndex);
251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
251961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Component should support this port definition*/
252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamAudioInit:
252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
252261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PORT_PARAM_TYPE *audioPortParamType =
252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PORT_PARAM_TYPE *) paramData;
25248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit");
252561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nSize = sizeof(audioPortParamType);
252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nPorts           = 0;
252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nStartPortNumber = 0;
252961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
253061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
253161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Component should support this port definition*/
253261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamImageInit:
253361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
253461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PORT_PARAM_TYPE *imagePortParamType =
253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PORT_PARAM_TYPE *) paramData;
25368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit");
253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
253861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nSize = sizeof(imagePortParamType);
253961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nPorts           = 0;
254061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nStartPortNumber = 0;
254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
2542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
254361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
254461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Component should support this port definition*/
254561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamOtherInit:
254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
25478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x",
254861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet =OMX_ErrorUnsupportedIndex;
255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
255161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamStandardComponentRole:
255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
255461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_COMPONENTROLETYPE *comp_role;
255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
255761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role->nSize = sizeof(*comp_role);
255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
25598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d",
256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_MAX_STRINGNAME_SIZE);
256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
256461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
256561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Added for parameter test */
256661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPriorityMgmt:
256761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
2568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
256961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PRIORITYMGMTTYPE *priorityMgmType =
257061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PRIORITYMGMTTYPE *) paramData;
25718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt");
257261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
257361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                priorityMgmType->nSize = sizeof(priorityMgmType);
2574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
257561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
257661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Added for parameter test */
257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamCompBufferSupplier:
257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
258061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
258161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
25828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier");
258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufferSupplierType->nSize = sizeof(bufferSupplierType);
258561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (0 == bufferSupplierType->nPortIndex)
258761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
258861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else if (1 == bufferSupplierType->nPortIndex)
258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else
259161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
259361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
259461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
259561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
259661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc:
259761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
25988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x",
2599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
260061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
260161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
260261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263:
260361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x",
2605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
260661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
260761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
260861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4:
260961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x",
261161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
261261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
261461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg2:
261561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x",
2617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
261861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
261961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
262061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoProfileLevelQuerySupported:
262161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex);
262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
262461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
262561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = get_supported_profile_level_for_1080p(profileLevelType);
262661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
262761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
262861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
262961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage");
263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
263361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
263461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (secure_mode) {
263661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                GRALLOC_USAGE_PRIVATE_UNCACHED);
263861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
263961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_
264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
264161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else
264261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
264361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
26448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("nativeBuffersUsage->nUsage %x", (unsigned int)nativeBuffersUsage->nUsage);
264561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
264661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
26478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!");
264861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadParameter;
264961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
265061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
2651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
265261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
265361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
265461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
265561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex);
265761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet =OMX_ErrorUnsupportedIndex;
265861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
266061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
26628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)",
266361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.frame_width,
266461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.frame_height,
266561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.stride,
266661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.scan_lines);
2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
266861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
2677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
267861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((params == NULL) ||
267961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (params->nativeBuffer == NULL) ||
268061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (params->nativeBuffer->handle == NULL) ||
268161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            !m_enable_android_native_buffers)
2682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_use_android_native_buffers = OMX_TRUE;
2684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
2685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    private_handle_t *handle = (private_handle_t *)nBuf->handle;
268661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
2687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_U8 *buffer = NULL;
268861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
268961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer = (OMX_U8*)mmap(0, handle->size,
2690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
269161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer == MAP_FAILED) {
269261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
269361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
2694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
2697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
2699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
2701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
270461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
270561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::Setparameter
2706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
270761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
270861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Set Parameter method implementation.
2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
271061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
2712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
271361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
271461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
2715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
271661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
271861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE paramIndex,
271961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR        paramData)
2720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
27226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    int ret=0;
27236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    struct v4l2_format fmt;
272461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
27258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Set Param in Invalid State");
2726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
272861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (paramData == NULL) {
27298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Param in Invalid paramData");
273061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
2731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
273261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((m_state != OMX_StateLoaded) &&
273361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_out_bEnabled == OMX_TRUE) &&
273561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
273661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_inp_bEnabled == OMX_TRUE)) {
27378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Set Param in Invalid State");
2738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
2739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
274061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)paramIndex) {
274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition:
2742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
274361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
274561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
274661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //been called.
27478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
274861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (int)portDefn->format.video.nFrameHeight,
274961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (int)portDefn->format.video.nFrameWidth);
275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (OMX_DirOutput == portDefn->eDir) {
27518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_display_id = portDefn->format.video.pNativeWindow;
275361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    unsigned int buffer_size;
275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!client_buffers.get_buffer_req(buffer_size)) {
27558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Error in getting buffer requirements");
275661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorBadParameter;
275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->nBufferSize >=  drv_ctx.op_buf.buffer_size ) {
276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
276161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = set_buffer_req(&drv_ctx.op_buf);
276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (eRet == OMX_ErrorNone)
276461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                m_port_def = *portDefn;
276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
27668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)",
276761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    portDefn->nBufferCountActual, portDefn->nBufferSize);
276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorBadParameter;
277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
277161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
277261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (OMX_DirInput == portDefn->eDir) {
277361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((portDefn->format.video.xFramerate >> 16) > 0 &&
277461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
277561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        // Frame rate only should be set if this is a "known value" or to
277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        // activate ts prediction logic (arbitrary mode only) sending input
277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        // timestamps with max value (LLONG_MAX).
277861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu",
277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.xFramerate >> 16);
278061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.frame_rate.fps_denominator);
278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!drv_ctx.frame_rate.fps_numerator) {
278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator = 30;
278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
278661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (drv_ctx.frame_rate.fps_denominator)
278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator = (int)
278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
278961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.frame_rate.fps_denominator = 1;
279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator;
279261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                frm_int, drv_ctx.frame_rate.fps_numerator /
279461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (float)drv_ctx.frame_rate.fps_denominator);
279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
27968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
279761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.video_resolution.frame_height !=
279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portDefn->format.video.nFrameHeight ||
279961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.video_resolution.frame_width  !=
280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portDefn->format.video.nFrameWidth) {
28018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("SetParam IP: WxH(%d x %d)",
280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.nFrameWidth,
280361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.nFrameHeight);
280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (portDefn->format.video.nFrameHeight != 0x0 &&
280561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.nFrameWidth != 0x0) {
280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            update_resolution(portDefn->format.video.nFrameWidth,
280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    portDefn->format.video.nFrameHeight);
280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
281061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.fmt.pix_mp.pixelformat = output_capability;
28128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen 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);
281361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (ret) {
28158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("Set Resolution failed");
281661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                eRet = OMX_ErrorUnsupportedSetting;
281761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else
281861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                eRet = get_buffer_req(&drv_ctx.op_buf);
281961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
282161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
282261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
282361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
282461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (~(buffer_prop->alignment - 1));
282661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = set_buffer_req(buffer_prop);
282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
28288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)",
282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->nBufferCountActual, portDefn->nBufferSize);
283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorBadParameter;
283261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portDefn->eDir ==  OMX_DirMax) {
283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (int)portDefn->nPortIndex);
283661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
2838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
283961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat:
2841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
284461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int ret=0;
284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_format fmt;
28468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d",
284761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat);
284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (1 == portFmt->nPortIndex) {
285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.pixelformat = capture_capability;
285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    enum vdec_output_fromat op_format;
285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
285661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) ||
285761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar))
285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else if (portFmt->eColorFormat ==
286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (OMX_COLOR_FORMATTYPE)
286161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        op_format = VDEC_YUV_FORMAT_TILE_4x2;
286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else
286461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorBadParameter;
286561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
286661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (eRet == OMX_ErrorNone) {
286761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.output_format = op_format;
286861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ret) {
28708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("Set output format failed");
287161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorUnsupportedSetting;
287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            /*TODO: How to handle this case */
287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = get_buffer_req(&drv_ctx.op_buf);
287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
287761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (eRet == OMX_ErrorNone) {
287861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
28798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("Set color format failed");
288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorBadParameter;
288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
288261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
2884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
288561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
288661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexPortDefn:
2888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
288961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
289061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
28918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d",
289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->nFramePackingFormat);
289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
289461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Input port */
289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (portFmt->nPortIndex == 0) {
289661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (secure_mode) {
289861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            arbitrary_bytes = false;
289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorUnsupportedSetting;
290161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            arbitrary_bytes = true;
290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (portFmt->nFramePackingFormat ==
290561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
290661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        arbitrary_bytes = false;
290761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu",
290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portFmt->nFramePackingFormat);
291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
291161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
291261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
29138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port");
291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
291561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
291761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_out_mem_region_smi = OMX_TRUE;
291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
29198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set");
292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_use_output_pmem = OMX_TRUE;
292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
292261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
292361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
2924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
292561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
292661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
292761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamStandardComponentRole:
29286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            {
292961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_COMPONENTROLETYPE *comp_role;
293061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
29318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        comp_role->cRole);
293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ((m_state == OMX_StateLoaded)&&
293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
293661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("Set Parameter called in valid state");
293761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
29388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
293961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorIncorrectStateOperation;
294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
294361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
294461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
294561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
294761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
294861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
294961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
295061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((char*)comp_role->cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
295161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
295261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
295461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
295561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
295661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
295761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
295861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.mpeg4",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.h263",OMX_MAX_STRINGNAME_SIZE)) {
296461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
296561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
296661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
296961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
297261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
297561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
297761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ) {
298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) {
298161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
298261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
298561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
298861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ) {
298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) {
299061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
299161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
299461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
299661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
299761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE))) {
299861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
299961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
30008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
300261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
30048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind);
300561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorInvalidComponentName;
300661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
300761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
30086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
300961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
301061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPriorityMgmt:
3011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state != OMX_StateLoaded) {
30138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
301461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorIncorrectStateOperation;
301561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
301661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
30178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d",
301861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        priorityMgmtype->nGroupID);
3019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
30208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d",
302161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        priorityMgmtype->nGroupPriority);
3022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
302361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
302461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
3025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
302661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
302961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamCompBufferSupplier:
30306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            {
303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
30328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufferSupplierType->eBufferSupplier);
303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
303561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else
303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
303961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
304161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
30436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
304461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc:
304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
30468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d",
304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
305061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263:
305161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
30528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d",
305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
305661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4:
305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
30588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d",
305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
306261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg2:
306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
30648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d",
306561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
306761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoDecoderPictureOrder:
306961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
307261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control control;
307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int pic_order,rc=0;
30748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d",
307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pictureOrder->eOutputPictureOrder);
307661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
307861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
307961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
308061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    time_stamp_dts.set_timestamp_reorder_mode(false);
308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadParameter;
308361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (eRet == OMX_ErrorNone) {
308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.value = pic_order;
308661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (rc) {
30888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Set picture order failed");
308961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
309261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
309461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamConcealMBMapExtraData:
309561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode)
309661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
309761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else {
30998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("secure mode setting not supported");
310061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamFrameInfoExtraData:
310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
310561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode)
310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
310761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            ((QOMX_ENABLETYPE *)paramData)->bEnable);
310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else {
31098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("secure mode setting not supported");
311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamInterlaceExtraData:
311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode)
311661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
311761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
311861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else {
31198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("secure mode setting not supported");
312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
312261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamH264TimeInfo:
312461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode)
312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
312661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
312761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else {
31288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("secure mode setting not supported");
312961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
313061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
313161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
313261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoDivx:
313361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
313461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
313561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
313661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
313761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexPlatformPvt:
313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
31398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port");
314061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
314161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
314261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
314361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
314461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
314561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_pvt_entry_pmem = OMX_TRUE;
314661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
31478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set");
314861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_use_output_pmem = OMX_TRUE;
314961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
315061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
315161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
315261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
315361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
315461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
315561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
315661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
315761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
315861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control control;
315961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int rc;
316061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.idr_only_decoding = 1;
316161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
316261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
316361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
316461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc) {
31658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Set picture order failed");
316661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
316761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
316861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
316961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
317061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
317161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (rc) {
31728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Sync frame setting failed");
317361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
317461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
317561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
317661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
317761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
3178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
317961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamIndexExtraDataType:
318061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
318161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
318261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
318361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
318461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (extradataIndexType->bEnabled == OMX_TRUE) &&
318561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (extradataIndexType->nPortIndex == 1)) {
31868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
318761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
318861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
318961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
319061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
319161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
319261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
319361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamEnableSmoothStreaming:
3194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
319561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control control;
319661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_format fmt;
319761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
319861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.value = 1;
319961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
320061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc < 0) {
320161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
320261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorHardware;
320361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
320461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
320561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
3206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
320761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Need to allow following two set_parameters even in Idle
320861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             * state. This is ANDROID architecture which is not in sync
320961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             * with openmax standard. */
321061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
321161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
321261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
321361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (enableNativeBuffers) {
321461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_enable_android_native_buffers = enableNativeBuffers->enable;
321561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
321661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
321761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
321861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
321961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
322061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = use_android_native_buffer(hComp, paramData);
322161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
322261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
3223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
322461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamEnableTimeStampReorder:
322561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
322661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
322761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
322861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (reorder->bEnable == OMX_TRUE) {
322961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frm_int =0;
323061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        time_stamp_dts.set_timestamp_reorder_mode(true);
323161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else
323261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        time_stamp_dts.set_timestamp_reorder_mode(false);
323361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
323461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    time_stamp_dts.set_timestamp_reorder_mode(false);
323561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (reorder->bEnable == OMX_TRUE) {
323661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
323761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
323861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
323961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
324061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
324161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
324261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
32438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex);
324461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedIndex;
324561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
324661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
324761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
325161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
325261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetConfig
3253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
325461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
325561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Get Config Method implementation.
3256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
325761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
325861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
326061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
326161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
3262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
326361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
326561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE configIndex,
326661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_PTR     configData)
3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
326861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
3269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
327061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
32718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Config in Invalid State");
327261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
327361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
327461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
327561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)configIndex) {
327661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexConfigInterlaced:
327761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
327861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
327961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
328061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (configFmt->nPortIndex == 1) {
328161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (configFmt->nIndex == 0) {
328261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
328361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (configFmt->nIndex == 1) {
328461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        configFmt->eInterlaceType =
328561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
328661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (configFmt->nIndex == 2) {
328761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        configFmt->eInterlaceType =
328861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
328961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
329061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
32918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                " NoMore Interlaced formats");
329261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorNoMore;
329361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
329461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
329561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
32968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port",
329761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (int)configFmt->nPortIndex);
329861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
329961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
330061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
330161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
330261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexQueryNumberOfVideoDecInstance:
330361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
330461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
330561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
330661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                decoderinstances->nNumOfInstances = 16;
330761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*TODO: How to handle this case */
330861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
330961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
331061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexConfigVideoFramePackingArrangement:
331161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
331261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
331361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
331461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
331561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->get_frame_pack_data(configFmt);
331661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
331761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
331861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
331961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
332061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
332161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigCommonOutputCrop:
332261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
332361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
332461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
332561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
332661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
332761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
332861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
33298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex);
333061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
333161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
333261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
333361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
333461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
333561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
333961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
334061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SetConfig
3341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
334261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
334361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Set Config method implementation
3344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
334561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
334661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
334861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
334961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
335061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
335261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE configIndex,
335361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR        configData)
3354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
335561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
33568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Config in Invalid State");
335761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
335861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
335961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
336061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
336161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_VIDEO_CONFIG_NALSIZE *pNal;
336261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
33638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Set Config Called");
336461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
336561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateExecuting) {
33668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("set_config:Ignore in Exe state");
336761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
336861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
336961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
337061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData) {
337161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
33728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData called");
337361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) {
33748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData AVC");
337561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U32 extra_size;
337661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Parsing done here for the AVC atom is definitely not generic
337761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Currently this piece of code is working, but certainly
337861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // not tested with all .mp4 files.
337961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Incase of failure, we might need to revisit this
338061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // for a generic piece of code.
338161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
338261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Retrieve size of NAL length field
338361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // byte #4 contains the size of NAL lenght field
338461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_length = (config->pData[4] & 0x03) + 1;
338561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
338661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_size = 0;
338761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (nal_length > 2) {
338861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
338961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                extra_size = (nal_length - 2) * 2;
339061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
339161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
339261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // SPS starts from byte #6
339361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
339461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U8 *pDestBuf;
3395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
339661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
339761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // minus 6 --> SPS starts from byte #6
339861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // minus 1 --> picture param set byte to be ignored from avcatom
339961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
340061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
340161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U32 len;
340261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U8 index = 0;
340361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // case where SPS+PPS is sent as part of set_config
340461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pDestBuf = m_vendor_config.pData;
340561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
34068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]",
340761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_vendor_config.nPortIndex,
340861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_vendor_config.nDataSize,
340961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_vendor_config.pData);
341061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (index < 2) {
341161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                uint8 *psize;
341261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len = *pSrcBuf;
341361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len = len << 8;
341461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len |= *(pSrcBuf + 1);
341561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psize = (uint8 *) & len;
341661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
341761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                for (unsigned int i = 0; i < nal_length; i++) {
341861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pDestBuf[i] = psize[nal_length - 1 - i];
341961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
342061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //memcpy(pDestBuf,pSrcBuf,(len+2));
342161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pDestBuf += len + nal_length;
342261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pSrcBuf += len + 2;
342361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index++;
342461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pSrcBuf++;   // skip picture param set
342561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len = 0;
342661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
342761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
342861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) {
3429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
3430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nDataSize = config->nDataSize;
343161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
343261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
343361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) {
343461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_vendor_config.pData) {
343561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_vendor_config.pData);
343661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData = NULL;
343761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize = 0;
343861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
343961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
344061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (((*((OMX_U32 *) config->pData)) &
344161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        VC1_SP_MP_START_CODE_MASK) ==
344261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    VC1_SP_MP_START_CODE) {
34438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_config - VC1 simple/main profile");
344461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nPortIndex = config->nPortIndex;
344561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize = config->nDataSize;
344661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData =
344761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_U8 *) malloc(config->nDataSize);
344861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(m_vendor_config.pData, config->pData,
344961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        config->nDataSize);
345061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vc1_profile = VC1_SP_MP_RCV;
345161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) {
34528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_config - VC1 Advance profile");
345361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nPortIndex = config->nPortIndex;
345461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize = config->nDataSize;
345561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData =
345661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_U8 *) malloc((config->nDataSize));
345761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(m_vendor_config.pData, config->pData,
345861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        config->nDataSize);
345961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vc1_profile = VC1_AP;
346061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) {
34618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only");
346261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nPortIndex = config->nPortIndex;
346361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize  = config->nDataSize;
346461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
346561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
346661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vc1_profile = VC1_SP_MP_RCV;
346761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
34688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile");
346961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
347161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
347261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (configIndex == OMX_IndexConfigVideoNalSize) {
347361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
347461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
347561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_length = pNal->nNaluBytes;
347661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
34778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
347861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
3479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
348161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
348561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
348661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetExtensionIndex
3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
348861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
348961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX GetExtensionIndex method implementaion.  <TBD>
3490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
349161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
349261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
349461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
349561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
349761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
349961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_STRING      paramName,
350061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_INDEXTYPE* indexType)
3501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
350261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
35038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State");
3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
350561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
350761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) {
3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
351161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
351361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
3514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
351561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
35168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extension: %s is supported", paramName);
3517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
351861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
3520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
352261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
35238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName);
3524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorNotImplemented;
3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
353061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
353161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetState
3532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
353361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
353461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns the state information back to the caller.<TBD>
3535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
353661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
353761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
353961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
354061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Error None if everything is successful.
354161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
354361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_STATETYPE* state)
3544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
354561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *state = m_state;
35468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_state: Returning the state %d",*state);
354761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
3548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
355161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
355261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentTunnelRequest
3553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
355461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
355561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Component Tunnel Request method implementation. <TBD>
3556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
355761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
355861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
3559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
356061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
356161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
3562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
356361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
356561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
356661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE        peerComponent,
356761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                    peerPort,
356861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
3569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
35708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented");
357161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
3572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
357561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
357661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseOutputBuffer
3577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
357861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
357961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper function for Use buffer in the input pin
3580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
358161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
358261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
3583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
358461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
358561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
3586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
358761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
35886eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_extradata()
35896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
35906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
359161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.extradata_info.buffer_size) {
359261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
359361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
359461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
359561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.extradata_info.ion);
359661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
359761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
35988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("allocate extradata memory size %d", drv_ctx.extradata_info.size);
359961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
360061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.size, 4096,
360161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.extradata_info.ion.ion_alloc_data,
360261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.extradata_info.ion.fd_ion_data, 0);
360361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
36048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to alloc extradata memory");
360561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
360661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
360761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
360861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.size,
360961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                PROT_READ|PROT_WRITE, MAP_SHARED,
361061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
361161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
36128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to map extradata memory");
361361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
361461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.extradata_info.ion);
361561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
361661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
361761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(drv_ctx.extradata_info.uaddr, 0, drv_ctx.extradata_info.size);
361861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
36196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
362061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
36216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
36226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
362361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_extradata()
362461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
36256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
362661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.extradata_info.uaddr) {
362761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
362861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
362961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_ion_memory(&drv_ctx.extradata_info.ion);
363061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
363161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
36326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
36336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
36346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
3635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_output_buffer(
363661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
363761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
363861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
363961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
364061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
364161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
3642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
364361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
364461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
364561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned                         i= 0; // Temporary counter
364661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
364761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_PTR privateAppData = NULL;
364861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    private_handle_t *handle = NULL;
364961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *buff = buffer;
365061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
365161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
365261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
36536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
365461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
365561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
365661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_output_headers();
365761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet == OMX_ErrorNone)
365861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_extradata();
365961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
366061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
366161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
366261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
366361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_out_bm_count,i)) {
366461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
366561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
36666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
366761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
366861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
366961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i >= drv_ctx.op_buf.actualcount) {
36708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount);
367161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
367261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
36736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
367461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
367561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
367661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
367761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_use_android_native_buffers) {
367861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
367961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sp<android_native_buffer_t> nBuf = params->nativeBuffer;
368061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                handle = (private_handle_t *)nBuf->handle;
368161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = params->pAppPrivate;
368261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
368361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                handle = (private_handle_t *)buff;
368461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
368561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
368661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
368761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
368861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
368961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        " expected %u, got %lu",
369061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
369161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
369261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
369361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
369461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.op_buf.buffer_size = (OMX_U32)handle->size;
369561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_use_android_native_buffers) {
369661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
369761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buff =  (OMX_U8*)mmap(0, handle->size,
369861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
369961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (buff == MAP_FAILED) {
370061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
370161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
370261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
37036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                }
37046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
37056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#if defined(_ANDROID_ICS_)
370661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            native_buffer[i].nativehandle = handle;
370761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            native_buffer[i].privatehandle = handle;
37086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
370961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!handle) {
371061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
371161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
371261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
371361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
371461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].offset = 0;
371561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
371661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].mmaped_size =
371761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
371861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
3719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
372161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!ouput_egl_buffers && !m_use_output_pmem) {
3722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
37238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("allocate output buffer memory size %d", drv_ctx.op_buf.buffer_size);
372461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
372561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
372661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
372761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
372861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
37298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd);
373061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
373161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
373261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
373361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                      drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
3734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
373561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
373661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                      open (MEM_DEVICE,O_RDWR);
3737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
373861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
37398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
374061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
374161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
374361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
374461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
374561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].pmem_fd = \
374661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                          open (MEM_DEVICE,O_RDWR);
374761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
37488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
374961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
375061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
375161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
375361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
375461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.buffer_size,
375561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.alignment)) {
37568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
375761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
375861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
375961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
376161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
376261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].bufferaddr =
376361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
376461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                PROT_READ|PROT_WRITE, MAP_SHARED,
376561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
376661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
376761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
3768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
376961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
3770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
37718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Unable to mmap output buffer");
377261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
377361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
377461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
377561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = 0;
377661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
377761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
377861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
377961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Use_op_buf: out_pmem=%d",m_use_output_pmem);
378061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!appData || !bytes ) {
378161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!secure_mode && !buffer) {
37828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case");
378361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
378461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
378561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
378661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
378761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
378861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
378961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
379061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!pmem_list->entryList || !pmem_list->entryList->entry ||
379161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !pmem_list->nEntries ||
379261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
37938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Pmem info not valid in use buffer");
379461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
379561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
379661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
379761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_list->entryList->entry;
379861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
379961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_info->pmem_fd);
380061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
380161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
380261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
380361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].mmaped_size =
380461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
380561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
3806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
380761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
380861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
380961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
381061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_out_mem_ptr + i );
381161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
381261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
381361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
381461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
381561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof (vdec_bufferpayload));
381661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
38178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
381861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr,
381961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd );
382061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
382161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = i;
382261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
382361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
382461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].length = drv_ctx.op_buf.buffer_size;
382561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
382661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
382761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
382861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
382961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].data_offset = 0;
383061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
383161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
383261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
383361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
383461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
383561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
383661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
383761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
383861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].data_offset = 0;
383961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
38408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
384161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
3842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
384361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = plane;
384461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = drv_ctx.num_planes;
384561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
38468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
3847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
384861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
38498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to prepare bufs");
385061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
385161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
3852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
385461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
385561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            enum v4l2_buf_type buf_type;
385661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
385761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
385861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
385961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
386061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                streaming[CAPTURE_PORT] = true;
38618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("STREAMON Successful");
386261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
386461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
386561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
386661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
386761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
386861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
386961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
387061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = buff;
387161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
387261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (*bufferHdr)->pAppPrivate = privateAppData;
387361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_out_bm_count,i);
387461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
387561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
387961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
388061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::use_input_heap_buffers
3881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
388261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
388361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use Buffer Heap allocation method implementation.
3884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
388561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
388661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
388861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
388961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None , if everything successful.
3890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
389161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
389361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
389461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
389561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
389661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
389761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
389861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
3899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
39008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer);
390161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
390261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_heap_ptr)
390361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
390461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
390561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.actualcount);
390661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_phdr_pmem_ptr)
390761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
390861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
390961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.actualcount);
391061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
391161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Insufficent memory");
391261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
391361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
391461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input_use_buffer = true;
391561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
391661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
391761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
391861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
391961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
392061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
392161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
392261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
39238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
392461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt],
392561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL, (unsigned)NULL)) {
39268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
392761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
392861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
392961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_in_alloc_cnt++;
393061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
393161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("All i/p buffers have been set!");
393261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
393361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
393461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
393861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
393961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseBuffer
3940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
394161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
394261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use Buffer method implementation.
3943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
394461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
394561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
394761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
394861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None , if everything successful.
3949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
395061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_buffer(
395261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
395361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
395461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
395561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
395661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
395761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
3958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
395961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE error = OMX_ErrorNone;
396061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
396161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
396261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || bytes == 0) {
396361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode && buffer == NULL) {
396461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
396561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
396661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
396761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
396861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
39698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Use Buffer in Invalid State");
397061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
397161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
397261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX)
397361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
397461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
397561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
397661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
39778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
397861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = OMX_ErrorBadPortIndex;
397961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
398061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
398161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (error == OMX_ErrorNone) {
398261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
398361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Send the callback now
398461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
398561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandStateSet,OMX_StateIdle,
398661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
398761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
398861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
398961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
399061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
399161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortEnable,
399261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_INPUT_PORT_INDEX,
399361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
399461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
399561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
399661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
399761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortEnable,
399861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_OUTPUT_PORT_INDEX,
399961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
400061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
400161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
400261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return error;
400361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
4004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
400661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
4007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
400861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
400961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr[bufferindex].pBuffer)
401061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free(m_inp_heap_ptr[bufferindex].pBuffer);
401161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[bufferindex].pBuffer = NULL;
401261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
401361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_bufferHdr)
401461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_input_buffer(pmem_bufferHdr);
401561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
402061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
402161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
402261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
402361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
402561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufferHdr - m_inp_mem_ptr;
40268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
402761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
402861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
40298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
403061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) {
403161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_setbuffer_cmd setbuffers;
403261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
403361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
403461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sizeof (vdec_bufferpayload));
40358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("unmap the input buffer fd=%d",
4036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].pmem_fd);
40378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("unmap the input buffer size=%d  address = %d",
4038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].mmaped_size,
4039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].bufferaddr);
404061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
404161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_inputbuffer[index].mmaped_size);
404261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
404361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
404461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
404561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_desc_buffer_ptr[index].buf_addr);
404661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_desc_buffer_ptr[index].buf_addr = NULL;
404761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_desc_buffer_ptr[index].desc_data_size = 0;
404861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
405061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
4051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
405261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
405561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
4056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
406061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
4061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
406261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
406361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
406461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
406661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufferHdr - m_out_mem_ptr;
40678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index);
4068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
406961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < drv_ctx.op_buf.actualcount
407061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && drv_ctx.ptr_outputbuffer) {
40718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %x", index,
407261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[index].bufferaddr);
4073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
407461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct vdec_setbuffer_cmd setbuffers;
407561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
407661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
407761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof (vdec_bufferpayload));
4078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
407961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
408061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
408161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
408261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[index].mmaped_size);
408361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
408461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
408561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
4086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
408761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) {
40888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("unmap the output buffer fd = %d",
408961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].pmem_fd);
40908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("unmap the ouput buffer size=%d  address = %d",
409161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
409261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].bufferaddr);
409361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
409461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
409561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
409661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
4097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
409861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
4099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
410061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
410261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
410461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_output_done()) {
410561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_extradata();
410661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
41076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
4108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
410961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
4110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
411461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE **bufferHdr,
411561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32              port,
411661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_PTR              appData,
411761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32              bytes)
4118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
411961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *input = NULL;
412061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char *buf_addr = NULL;
412161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
412261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned   i = 0;
412361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
412461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Sanity Check*/
412561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL) {
412661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
412761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
412861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
412961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_heap_ptr == NULL) {
413061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
413161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                         calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
413261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 drv_ctx.ip_buf.actualcount);
413361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
413461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
413561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  drv_ctx.ip_buf.actualcount);
413661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
413761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr == NULL) {
41388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("m_inp_heap_ptr Allocation failed ");
413961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
414061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
414161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
414261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
414361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Find a Free index*/
414461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
414561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
41468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
414761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
414861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
414961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
415061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
415161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < drv_ctx.ip_buf.actualcount) {
415261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
415361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
415461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buf_addr == NULL) {
415561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
415661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
415761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
415861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_inp_heap_ptr + i);
415961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input = *bufferHdr;
416061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_heap_inp_bm_count,i);
416161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
416261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pBuffer           = (OMX_U8 *)buf_addr;
416361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
416461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nVersion.nVersion = OMX_SPEC_VERSION;
416561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
416661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pAppPrivate       = appData;
416761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
41688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr );
416961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
41708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
417161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Add the Buffers to freeq*/
417261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i],
417361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL, (unsigned)NULL)) {
41748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
417561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
417661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
417761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
417861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
417961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
418061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
418161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
418761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
418861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateInputBuffer
4189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
419161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper function for allocate buffer in the input pin
4192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
419461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
419761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
4198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
420161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
420261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
420361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
420461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
420561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes)
4206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
420861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
420961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
421061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *input = NULL;
421161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned   i = 0;
421261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char *buf_addr = NULL;
421361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int pmem_fd = -1;
4214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
421561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bytes != drv_ctx.ip_buf.buffer_size) {
42168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Requested Size is wrong %d epected is %d",
421761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bytes, drv_ctx.ip_buf.buffer_size);
421861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
421961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
422161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_mem_ptr) {
42228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
422361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.actualcount,
422461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.buffer_size);
4225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
422661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
422761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
4228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
422961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_mem_ptr == NULL) {
423061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
423161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
423361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
423461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
4235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
423661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ptr_inputbuffer == NULL) {
423761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
423861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
424061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
424161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
4242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
424361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ip_buf_ion_info == NULL) {
424461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
424561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
424861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
424961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
4250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
425161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
4252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
425361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
425661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
425761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
42588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
425961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
426061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
426361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < drv_ctx.ip_buf.actualcount) {
426461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_buffer buf;
426561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_plane plane;
426661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc;
42676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
4268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
42698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate input Buffer size %d", drv_ctx.ip_buf.buffer_size);
427061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
427161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
427261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
427361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
427461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
427561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
427661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
427761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
4278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
427961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = open (MEM_DEVICE,O_RDWR);
4280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
428161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd < 0) {
42828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
428361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
428461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
428661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd == 0) {
428761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_fd = open (MEM_DEVICE,O_RDWR);
4288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
428961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_fd < 0) {
42908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
429161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
429261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
429361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
429561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
429661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.alignment)) {
42978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
429861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(pmem_fd);
429961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
430061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
430261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
430361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_addr = (unsigned char *)mmap(NULL,
430461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.buffer_size,
430561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
4306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
430761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buf_addr == MAP_FAILED) {
430861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(pmem_fd);
4309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
431061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
4311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
43128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Map Failed to allocate input buffer");
431361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
431461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
431561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
431661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_inp_mem_ptr + i);
431761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
431861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
431961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
432061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
432161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
432261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
432361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
432461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].offset = 0;
432561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
432661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
432761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = i;
432861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
432961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
433061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.bytesused = 0;
433161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
433261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
433361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
433461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.reserved[1] = 0;
433561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
433661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = &plane;
433761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = 1;
433861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
43398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]);
434061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
434161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
434261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
434361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
43448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to prepare bufs");
434561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
434661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
4347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
434961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input = *bufferHdr;
435061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_inp_bm_count,i);
43518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr);
435261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
435361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
435461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
435561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input->pBuffer           = (OMX_U8 *)buf_addr;
435661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
435761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nVersion.nVersion = OMX_SPEC_VERSION;
435861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
435961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pAppPrivate       = appData;
436061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
436161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
436261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
436361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.disable_dmx) {
436461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_desc_buffer(i);
436561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
436661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
43678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found");
436861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
436961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
437061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
437561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
437661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateOutputBuffer
4377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
437861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
437961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper fn for AllocateBuffer in the output pin
4380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
438161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
438261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
4383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
438461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
438561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went well.
4386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
438761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
438961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
439061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
439161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
439261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
439361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes)
4394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
439561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
439661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
439761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned                         i= 0; // Temporary counter
439861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
439961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
4400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
440161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ion_device_fd =-1;
440261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ion_allocation_data ion_alloc_data;
440361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ion_fd_data fd_ion_data;
4404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
440561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
44068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
440761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount,
440861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size);
440961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nBufHdrSize        = 0;
441061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformEntrySize = 0;
441161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformListSize  = 0;
441261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPMEMInfoSize = 0;
441361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int pmem_fd = -1;
441461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned char *pmem_baseaddress = NULL;
441561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
441661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
441761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
441861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
441961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
44208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)",
442161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
442261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufHdrSize        = drv_ctx.op_buf.actualcount *
442361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE);
442461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
442561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
442661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
442761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformListSize  = drv_ctx.op_buf.actualcount *
442861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
442961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
443061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
443161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
44328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
443361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof(OMX_BUFFERHEADERTYPE),
443461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,
443561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPlatformListSize);
44368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize,
443761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
4438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
44398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("allocate outputBuffer size %d",drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount);
444061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_device_fd = alloc_map_ion_memory(
444161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
444261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.alignment,
444361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0);
444461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ion_device_fd < 0) {
444561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
444661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
444761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = fd_ion_data.fd;
4448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
444961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = open (MEM_DEVICE,O_RDWR);
4450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
445161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd < 0) {
44528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
445361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.buffer_size);
445461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
445561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
445761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd == 0) {
445861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_fd = open (MEM_DEVICE,O_RDWR);
4459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
446061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_fd < 0) {
44618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
446261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size);
446361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
446461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
446561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
446761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
446861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.actualcount,
446961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.alignment)) {
44708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
447161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(pmem_fd);
447261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
447361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
447561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
447661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_baseaddress = (unsigned char *)mmap(NULL,
447761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (drv_ctx.op_buf.buffer_size *
447861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     drv_ctx.op_buf.actualcount),
447961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
448061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_baseaddress == MAP_FAILED) {
44818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("MMAP failed for Size %d",
448261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size);
448361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(pmem_fd);
4484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
448561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
4486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
448761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
448861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
448961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
449061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
449161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Alloc mem for platform specific info
449261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *pPtr=NULL;
449361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
449461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,1);
449561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
449661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   calloc (sizeof(struct vdec_bufferpayload),
449761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.op_buf.actualcount);
449861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
449961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 calloc (sizeof (struct vdec_output_frameinfo),
450061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         drv_ctx.op_buf.actualcount);
4501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
450261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
450361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc (sizeof(struct vdec_ion),
450461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          drv_ctx.op_buf.actualcount);
4505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
450761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
450861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && drv_ctx.ptr_respbuffer) {
450961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[0].mmaped_size =
451061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (drv_ctx.op_buf.buffer_size *
451161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 drv_ctx.op_buf.actualcount);
451261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufHdr          =  m_out_mem_ptr;
451361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
451461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
451561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_list)  + nPlatformListSize);
451661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
451761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_entry) + nPlatformEntrySize);
451861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformList   = m_platform_list;
451961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformEntry  = m_platform_entry;
452061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPMEMInfo       = m_pmem_info;
452161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
45228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
452361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
452461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Settting the entire storage nicely
45258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry);
45268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
452761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
452861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
452961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
453061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Set the values when we determine the right HxW param
453161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nAllocLen          = bytes;
453261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nFilledLen         = 0;
453361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pAppPrivate        = appData;
453461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
453561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Platform specific PMEM Information
453661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform Entry
45378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i);
453861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
453961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->entry      = pPMEMInfo;
454061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform List
454161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->nEntries    = 1;
454261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->entryList   = pPlatformEntry;
454361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep pBuffer NULL till vdec is opened
454461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pBuffer            = NULL;
454561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOffset            = 0;
454661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
454761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
454861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->pmem_fd = 0;
454961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pPlatformPrivate = pPlatformList;
455061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
455161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
455261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_pmem_info[i].pmem_fd = pmem_fd;
4553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
455461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
455561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
455661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
4557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
455961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Create a mapping between buffers*/
456061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
456161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer[i].client_data = (void *)\
456261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        &drv_ctx.ptr_outputbuffer[i];
456361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
456461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr =
456561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
456661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
45678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("pmem_fd = %d offset = %d address = %p",
456861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
456961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[i].bufferaddr);
457061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Move the buffer and buffer header pointers
457161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr++;
457261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo++;
457361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry++;
457461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList++;
457561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
457661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
45778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
457861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr, pPtr);
457961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_out_mem_ptr) {
458061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_out_mem_ptr);
458161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr = NULL;
458261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
458361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pPtr) {
458461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(pPtr);
458561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPtr = NULL;
458661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
458761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer) {
458861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_outputbuffer);
458961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer = NULL;
459061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
459161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_respbuffer) {
459261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_respbuffer);
459361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer = NULL;
459461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
459661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.op_buf_ion_info) {
45978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free o/p ion context");
459861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.op_buf_ion_info);
459961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info = NULL;
460061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
460261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet =  OMX_ErrorInsufficientResources;
460361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
460461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet == OMX_ErrorNone)
460561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_extradata();
460661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
460761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
460861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
460961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
46108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i);
461161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
461261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
461561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
461661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i < drv_ctx.op_buf.actualcount) {
461761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct v4l2_buffer buf;
461861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct v4l2_plane plane[VIDEO_MAX_PLANES];
461961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int rc;
462061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
462161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
462261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].buffer_len =
462361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size;
462461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
462561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *bufferHdr = (m_out_mem_ptr + i );
462661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (secure_mode) {
462761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
462861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
462961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
463061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
463161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.index = i;
463261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
463361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.memory = V4L2_MEMORY_USERPTR;
463461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].length = drv_ctx.op_buf.buffer_size;
463561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
463661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
46376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
463861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
46396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
464061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
464161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].data_offset = 0;
464261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
464361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
464461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
464561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
4646b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#ifdef USE_ION
464761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
4648b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#endif
464961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
465061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].data_offset = 0;
465161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (extra_idx >= VIDEO_MAX_PLANES) {
46528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx);
465361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
465461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
465561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.m.planes = plane;
465661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.length = drv_ctx.num_planes;
46578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
465861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
465961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc) {
466061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*TODO: How to handle this case */
466161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
466261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
466361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
466461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
466561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                enum v4l2_buf_type buf_type;
466661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
466761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
466861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc) {
466961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
467061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
467161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    streaming[CAPTURE_PORT] = true;
46728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("STREAMON Successful");
467361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
467461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
467561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
467661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
467761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pAppPrivate = appData;
467861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_out_bm_count,i);
467961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
46808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient");
468161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
468261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
468561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer  -- API Call
4690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
469161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
469261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateBuffer
4693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
469461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
469561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
4696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
469761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
469861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
470061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
470161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
4702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
470361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
470561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
470661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
470761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                     appData,
470861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                       bytes)
4709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned i = 0;
4711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
4712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
47138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port);
471461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
47158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State");
4716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
4717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
471961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
472061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (arbitrary_bytes) {
472161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
472261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
472361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
472461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
472561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
47266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
47276eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                appData,bytes);
472861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
47298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
473061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
4731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
473361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
473461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (allocate_done()) {
473561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
4736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
4737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
4738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandStateSet,OMX_StateIdle,
473961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
4740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
474261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
474361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
474461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
474561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,
4746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_CORE_INPUT_PORT_INDEX,
4747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
474861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
475061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
475161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
475261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
4753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandPortEnable,
475461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_CORE_OUTPUT_PORT_INDEX,
475561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
4756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
47598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet);
4760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
4761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call
4764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
476561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
476661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::FreeBuffer
4767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
476861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
4769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
477061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
477161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
477361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
477461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
4775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
477661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
477861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                 port,
477961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
4780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
4782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int nPortIndex;
47838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("In for decoder free_buffer");
4784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
478561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateIdle &&
478661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
47878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending");
478861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
478961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
47908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Buffer while port %d disabled", port);
479161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
479261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
479361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (port == OMX_CORE_OUTPUT_PORT_INDEX &&
479461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) {
47958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Buffer while port %d enable pending", port);
479661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
47978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled");
4798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
479961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ErrorPortUnpopulated,
480061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
4801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
480361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_state != OMX_StateInvalid) {
48048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers");
4805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
480661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ErrorPortUnpopulated,
480761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
4808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
481061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
481161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if arbitrary bytes*/
481261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!arbitrary_bytes && !input_use_buffer)
481361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPortIndex = buffer - m_inp_mem_ptr;
481461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
481561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPortIndex = buffer - m_inp_heap_ptr;
4816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex);
481861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nPortIndex < drv_ctx.ip_buf.actualcount) {
481961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Clear the bit associated with it.
482061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
482161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
482261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (input_use_buffer == true) {
482361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
48248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex);
482561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_phdr_pmem_ptr)
482661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
482761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
482861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (arbitrary_bytes) {
482961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_phdr_pmem_ptr)
483061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
483161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else
483261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_input_buffer(nPortIndex,NULL);
483361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
483461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    free_input_buffer(buffer);
4835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
483661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bPopulated = OMX_FALSE;
483761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Free the Buffer Header*/
483861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (release_input_done()) {
48398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("ALL input buffers are freed/released");
484061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer_header();
484161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
484261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
48438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid");
4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
4845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
484761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
484861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && release_input_done()) {
48498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
4850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
4851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandPortDisable,
485261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_INPUT_PORT_INDEX,
485361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
4854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
485561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
4856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // check if the buffer is valid
48576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        nPortIndex = buffer - client_buffers.get_il_buf_hdr();
485861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nPortIndex < drv_ctx.op_buf.actualcount) {
48598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex);
4860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Clear the bit associated with it.
4861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
4862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_out_bPopulated = OMX_FALSE;
48636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            client_buffers.free_output_buffer (buffer);
4864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
486561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (release_output_done()) {
486661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_output_buffer_header();
4867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
486861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
48698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid");
4870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
4871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
487261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
487361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && release_output_done()) {
48748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it");
4875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
487761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
48786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_
487961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_enable_android_native_buffers) {
488061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
488161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
488261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
48836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
4884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
488561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortDisable,
488661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_OUTPUT_PORT_INDEX,
488761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
4888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
488961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
4890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadPortIndex;
4891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
489261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((eRet == OMX_ErrorNone) &&
489361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
489461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_done()) {
4895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Send the callback now
4896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
4897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandStateSet, OMX_StateLoaded,
489861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
4899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
4902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
490661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
490761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::EmptyThisBuffer
4908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
490961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
491061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   This routine is used to push the encoded video frames to
491161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   the video decoder.
4912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
491361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
491461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
491661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
491761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went successful.
4918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
491961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
492161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
4922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
492361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
492461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
4925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
49268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
49278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        codec_config_flag = true;
49288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
49298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
493061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
49318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Empty this buffer in Invalid State");
493261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
493361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
493561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
49368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL");
493761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
493861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
494061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_bEnabled) {
49418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled.");
494261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
494361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
494561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
49468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %lu", buffer->nInputPortIndex);
494761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
494861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
495061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_
495161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (iDivXDrmDecrypt) {
495261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
495361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drmErr != OMX_ErrorNone) {
495461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // this error can be ignored
49558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
495661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
495761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
495861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif //_ANDROID_
495961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
496061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!latency) {
496161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec_time.stop();
496261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            latency = dec_time.processing_time_us();
496361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec_time.start();
496461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
496561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
496661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
496761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
496861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufferIndex = buffer - m_inp_heap_ptr;
496961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
497061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (input_use_buffer == true) {
497161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nBufferIndex = buffer - m_inp_heap_ptr;
497261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
497361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
497461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
497561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer = &m_inp_mem_ptr[nBufferIndex];
497661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
497761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
497861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
497961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nBufferIndex = buffer - m_inp_mem_ptr;
498061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
498161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
498261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
498361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nBufferIndex > drv_ctx.ip_buf.actualcount ) {
49848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid");
498561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
498661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
498761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
498861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
498961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
499061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
499161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned)hComp,(unsigned)buffer,
499261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
499361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
499461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
499561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            set_frame_rate(buffer->nTimeStamp);
499661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
499761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
499961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
500061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
500161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/* ======================================================================
500261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
500361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::empty_this_buffer_proxy
500461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
500561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
500661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   This routine is used to push the encoded video frames to
500761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   the video decoder.
500861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
500961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
501061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
501161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
501261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
501361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went successful.
501461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
501561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
501661a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
501761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
501861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
501961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int push_cnt = 0,i=0;
502061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned nPortIndex = 0;
502161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
502261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_input_frameinfo frameinfo;
502361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_bufferpayload *temp_buffer;
502461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_seqheader seq_header;
502561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool port_setting_changed = true;
502661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool not_coded_vop = false;
502761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
502861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Should we generate a Aync error event*/
502961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
50308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid");
503161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
503261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
503361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
503461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
503561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
503661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nPortIndex > drv_ctx.ip_buf.actualcount) {
50378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
503861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPortIndex);
503961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
504061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
504161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
504261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_input_buffers++;
504361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
504461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return zero length and not an EOS buffer */
504561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
504661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
50478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("return zero legth buffer");
504861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
504961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EBD);
505061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
505161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
505461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX) {
505561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        mp4StreamType psBits;
505661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
505761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psBits.numBytes = buffer->nFilledLen;
505861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        mp4_headerparser.parseHeader(&psBits);
505961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        not_coded_vop = mp4_headerparser.is_notcodec_vop(
506061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
506161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (not_coded_vop) {
50628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Found Not coded vop len %lu frame number %u",
506361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buffer->nFilledLen,frame_count);
506461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
50658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Eos and Not coded Vop set len to zero");
506661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                not_coded_vop = false;
506761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer->nFilledLen = 0;
506861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
5069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
507261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (input_flush_progress == true
5073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
507461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            || not_coded_vop
5075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
507661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan       ) {
50778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Flush in progress return buffer ");
507861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
507961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EBD);
508061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
508161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
508261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
508361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
508461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
508561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) {
508661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
508761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
508861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
50898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
509061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*for use buffer we need to memcpy the data*/
509161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp_buffer->buffer_len = buffer->nFilledLen;
509261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
509361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (input_use_buffer) {
509461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFilledLen <= temp_buffer->buffer_len) {
509561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (arbitrary_bytes) {
509661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
509761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
509861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
509961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nFilledLen);
510061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
510161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
510261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
510361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
510461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
510561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
510661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
510761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.bufferaddr = temp_buffer->bufferaddr;
510861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.client_data = (void *) buffer;
510961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.datalen = temp_buffer->buffer_len;
511061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.flags = 0;
511161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.offset = buffer->nOffset;
511261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.pmem_fd = temp_buffer->pmem_fd;
511361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.pmem_offset = temp_buffer->offset;
511461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.timestamp = buffer->nTimeStamp;
511561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
511661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("ETB: dmx enabled");
511761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_demux_entries == 0) {
511861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extract_demux_addr_offsets(buffer);
511961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
512061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
512161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
512261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        handle_demux_data(buffer);
512361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
512461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
512561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
512661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_addr = NULL;
512761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_size = 0;
512861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
512961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes) {
513061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= buffer->nFlags;
5131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
513461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
513561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (arbitrary_bytes) {
51368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
513761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_timestamp_list.insert_ts(buffer->nTimeStamp);
513861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
51398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
514061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_timestamp_list.insert_ts(buffer->nTimeStamp);
514161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
514261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
514661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (inputBufferFile1) {
514761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fwrite((const char *)temp_buffer->bufferaddr,
514861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                temp_buffer->buffer_len,1,inputBufferFile1);
514961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
515261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
515361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
515461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
515561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
515661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
515761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
51588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached");
515961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
516061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_scratch.nFilledLen = 0;
516161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_count = 0;
516261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
516361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_count = 0;
516461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils)
516561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils->initialize_frame_checking_environment();
516661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.flush();
516761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_ts = LLONG_MAX;
516861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_flags = 0;
516961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
517061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_entries = 0;
517161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
517261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
517361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane;
517461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&buf, 0, sizeof(buf));
517561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&plane, 0, sizeof(plane));
517661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
517761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long  print_count;
517861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
51798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.flags = V4L2_QCOM_BUF_FLAG_EOS;
51808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("INPUT EOS reached") ;
518161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
518261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
518361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = nPortIndex;
518461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
518561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
518661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.bytesused = temp_buffer->buffer_len;
518761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.length = drv_ctx.ip_buf.buffer_size;
518861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
518961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)temp_buffer->offset;
519061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[0] = temp_buffer->pmem_fd;
519161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[1] = temp_buffer->offset;
519261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.data_offset = 0;
519361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = &plane;
519461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = 1;
519561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (frameinfo.timestamp >= LLONG_MAX) {
519661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
519761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
519861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //assumption is that timestamp is in milliseconds
519961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
520061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
520161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
520261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
520361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
520461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
52058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver");
520661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorHardware;
520761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
52088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    codec_config_flag = false;
52098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("%s: codec_config cleared", __FUNCTION__);
52108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
521161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!streaming[OUTPUT_PORT]) {
521261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enum v4l2_buf_type buf_type;
521361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int ret,r;
521461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
521561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
52168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
521761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
521861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!ret) {
52198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful");
522061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            streaming[OUTPUT_PORT] = true;
522161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
522261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
52238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT");
522461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
522561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
522661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EBD);
522761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
522861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
522961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
523061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
523161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
523261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    time_stamp_dts.insert_timestamp(buffer);
5233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
523461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
5235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
523861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
523961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::FillThisBuffer
5240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
524161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
524261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL client uses this method to release the frame buffer
524361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   after displaying them.
5244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
524561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
524661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
524861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
524961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
525161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
525361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
525661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
52578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("FTB in Invalid State");
525861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
525961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
526061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
526161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_bEnabled) {
52628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled.");
526361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
526461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
526561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
526661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL ||
526761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount)) {
526861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
526961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
527061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
527161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
52728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex);
527361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
527461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
527561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
527661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
527761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg);
527861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
528161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
528261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::fill_this_buffer_proxy
5283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
528461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
528561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL client uses this method to release the frame buffer
528661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   after displaying them.
5287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
528861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
528961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
529161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
529261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
529461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
529661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE        hComp,
529761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
5298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
529961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE nRet = OMX_ErrorNone;
530061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
530161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned nPortIndex = 0;
530261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_fillbuffer_cmd fillbuffer;
530361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
530461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
530561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
530661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
530761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
530861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount)
530961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
531061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
53118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
531261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufferAdd, bufferAdd->pBuffer);
531361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Return back the output buffer to client*/
531461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) {
53158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Output Buffers return flush/disable condition");
531661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
531761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.FillBufferDone (hComp,m_app_data,buffer);
531861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
531961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
532061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers++;
532161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
532261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
532361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ptr_respbuffer) {
532461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
532561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
532661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
532761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
532861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
532961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
533061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.FillBufferDone (hComp,m_app_data,buffer);
533161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pending_output_buffers--;
533261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
533361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
533461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
533561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
533661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
533761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
533861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&buf, 0, sizeof(buf));
533961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
534061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
534161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
534261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = nPortIndex;
534361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
534461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
534561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].bytesused = buffer->nFilledLen;
534661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].length = drv_ctx.op_buf.buffer_size;
534761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].m.userptr =
534861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
534961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
535061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
535161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
535261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].data_offset = 0;
535361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
535461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
535561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].bytesused = 0;
535661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
535761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
53586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
535961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
53606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
536161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
536261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].data_offset = 0;
536361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra_idx >= VIDEO_MAX_PLANES) {
53648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extradata index higher than expected: %d", extra_idx);
536561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
536661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
536761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = plane;
536861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = drv_ctx.num_planes;
536961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
537061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
537161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
537261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf to driver");
537361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
537461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
537861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
537961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SetCallbacks
5380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
538161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
538261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Set the callbacks.
5383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
538461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
538561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
538761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
538861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
5389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
539061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
539261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_CALLBACKTYPE* callbacks,
539361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR             appData)
5394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
539661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_cb       = *callbacks;
53978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
539861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EventHandler,m_cb.FillBufferDone);
539961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_app_data =    appData;
540061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
5401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
540461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
540561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentDeInit
5406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
540761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
540861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Destroys the component and release memory allocated to the heap.
5409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
541061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
541161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
541361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
541461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
5415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
541661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
5418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
542061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (iDivXDrmDecrypt) {
5421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete iDivXDrmDecrypt;
5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        iDivXDrmDecrypt=NULL;
5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
54266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    unsigned i = 0;
542761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_StateLoaded != m_state) {
54288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\
542961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state);
54308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Playback Ended - FAILED");
543161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
54328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Playback Ended - PASSED");
5433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the output buffers have to be cleaned up*/
543661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
54378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Freeing the Output Memory");
543861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) {
543961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_output_buffer (&m_out_mem_ptr[i]);
5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
544161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ICS_
544261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
544361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
5444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the input buffers have to be cleaned up*/
544761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr || m_inp_heap_ptr) {
54488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Freeing the Input Memory");
544961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) {
545061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_inp_mem_ptr)
545161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer (i,&m_inp_mem_ptr[i]);
545261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else
545361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer (i,NULL);
5454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer_header();
5457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_output_buffer_header();
545861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer) {
5459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(h264_scratch.pBuffer);
5460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.pBuffer = NULL;
5461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
546361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_parser) {
5464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete h264_parser;
546561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_parser = NULL;
5466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
546861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_platform_list) {
5469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_platform_list);
5470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_platform_list = NULL;
5471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
547261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_vendor_config.pData) {
5473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_vendor_config.pData);
5474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_vendor_config.pData = NULL;
5475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Reset counters in mesg queues
5478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_size=0;
5479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_size=0;
5480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_size=0;
5481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_read = m_ftb_q.m_write =0;
5482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_read = m_cmd_q.m_write =0;
5483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_read = m_etb_q.m_write =0;
5484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
548561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
548661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_timestamp_list.reset_ts_list();
5487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
54908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG");
5491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
549261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // NULL);
54938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Close the driver instance");
54946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
5495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
5496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (inputBufferFile1);
5497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
54996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    if (outputBufferFile1)
550061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fclose (outputBufferFile1);
5501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
5503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputExtradataFile);
5504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
55058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec::component_deinit() complete");
550661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
551061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
551161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseEGLImage
5512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
551361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
551461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use EGL Image method implementation <TBD>.
5515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
551661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
551761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
551961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
552061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Not Implemented error.
5521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
552261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
552461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
552561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
552661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                     appData,
552761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN void*                      eglImage)
5528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
552961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
553061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
553161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
553461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
553561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    EGLint fd = -1, offset = 0,pmemPtr = 0;
5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
553761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fd = -1, offset = 0;
5538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
55398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("use EGL image support for decoder");
554061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
55418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("");
554261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
554461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_display_id == NULL) {
55458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Display ID is not set by IL client");
5546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
554761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
554861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
554961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eglGetProcAddress("eglQueryImageKHR");
555061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
555161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
555261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
5553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app
5554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl {
5555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int pmem_fd;
5556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int offset;
5557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    };
5558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl *temp_egl_id = NULL;
5559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    void * pmemPtr = (void *) eglImage;
5560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    temp_egl_id = (struct temp_egl *)eglImage;
556161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_egl_id != NULL) {
5562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fd = temp_egl_id->pmem_fd;
5563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        offset = temp_egl_id->offset;
5564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (fd < 0) {
55678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd);
5568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
556961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
557061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_info.pmem_fd = (OMX_U32) fd;
557161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_info.offset = (OMX_U32) offset;
557261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_entry.entry = (void *) &pmem_info;
557361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
557461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_list.entryList = &pmem_entry;
557561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_list.nEntries = 1;
557661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers = true;
557761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
557861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
557961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (OMX_U8 *)pmemPtr)) {
55808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("use buffer call failed for egl image");
558161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
558261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
558361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
558761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
558861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentRoleEnum
5589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
559061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
559161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Component Role Enum method implementation.
5592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
559361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
559461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
559661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
559761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything is successful.
559861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
560061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_U8*        role,
560161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32        index)
5602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
560361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
5604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
560561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
560661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
560761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
56088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
560961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
561061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
561161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
561361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
561461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
561561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
56168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
561761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
561861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
561961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
562061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
562161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
562261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
56238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
562461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
562661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
562761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
563061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
563161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) ) {
563261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
563361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
56348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
563561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
563761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
563861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
563961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
564061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
564161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
56428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
564361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
564561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
564661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
564761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
564861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
564961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
56508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
565161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
565361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
565461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
565561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
565661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
565761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ) {
565861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
565961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
56608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
566161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
566361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
566461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
566561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
566661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
566761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
56688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
566961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
567161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
567261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
567361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
56748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component");
567561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInvalidComponentName;
56766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
567761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
5678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
568461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
568561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateDone
5686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
568761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
568861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if entire buffer pool is allocated by IL Client or not.
568961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Need this to move to IDLE state.
5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
569261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
569561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
5696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void)
5699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
570061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
570161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet_In = false;
570261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet_Out = false;
5703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
570461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet_In = allocate_input_done();
570561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet_Out = allocate_output_done();
5706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
570761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bRet_In && bRet_Out) {
570861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
570961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
571161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
571461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
571561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateInputDone
5716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
571761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
571861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if I/P buffer pool is allocated by IL Client or not.
5719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
572061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
572161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
572361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
572461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
5725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
572661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void)
5728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
572961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
573061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0;
573161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
573261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr == NULL) {
573361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bRet;
573461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
573561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr ) {
573661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; i<drv_ctx.ip_buf.actualcount; i++) {
573761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
573861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
573961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
574061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
574161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
574261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i == drv_ctx.ip_buf.actualcount) {
574361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
574461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
574561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
574661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
574761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_bPopulated = OMX_TRUE;
574861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
574961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
575261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
575361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateOutputDone
5754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
575561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
575661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if entire O/P buffer pool is allocated by IL Client or not.
5757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
575861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
575961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
576161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
576261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
5763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
576461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void)
5766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
576761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
576861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned j=0;
576961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
577061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr == NULL) {
577161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bRet;
577261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
577361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
577461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
577561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j < drv_ctx.op_buf.actualcount; j++) {
577661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_out_bm_count,j)) {
577761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
577861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
577961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
578061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
578161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
578261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (j == drv_ctx.op_buf.actualcount) {
578361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
578461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
578561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_bEnabled)
578661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bPopulated = OMX_TRUE;
578761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
578961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
579361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
579461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseDone
5795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
579661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
579761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
5798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
579961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
580061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
580261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
580361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
580561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void)
5807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
580861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
5809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
581061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (release_input_done()) {
581161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_output_done()) {
581261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
581361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
581561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
582061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
582161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseOutputDone
5822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
582361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
582461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
5825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
582661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
582761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
582961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
583061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
583261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void)
5834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
583561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
583661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0,j=0;
583761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
58388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p",m_inp_mem_ptr);
583961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
584061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j < drv_ctx.op_buf.actualcount ; j++) {
584161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_out_bm_count,j)) {
584261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
584361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
584461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
584561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (j == drv_ctx.op_buf.actualcount) {
584661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bm_count = 0;
584761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
584861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
584961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
585061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_bm_count = 0;
585161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
585261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
585361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
585661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
585761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseInputDone
5858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
585961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
586061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
5861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
586261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
586361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
586561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
586661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
586861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void)
5870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
587161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
587261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0,j=0;
587361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
58748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
587561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr) {
587661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j<drv_ctx.ip_buf.actualcount; j++) {
587761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
587861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
587961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
588061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
588161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (j==drv_ctx.ip_buf.actualcount) {
588261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
588361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
588461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
588561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
588661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
588761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
589161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE * buffer)
5892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
589361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
589461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) {
58958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer);
589661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
589761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (output_flush_progress) {
589861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
589961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
590061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nTimeStamp = 0;
590161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
590261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
590361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
590461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
59068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
590761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer, buffer->pBuffer);
590861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers --;
5909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
591061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
59118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Output EOS has been reached");
591261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!output_flush_progress)
591361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event((unsigned)NULL, (unsigned)NULL,
591461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EOS_DONE);
5915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
591661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame) {
591761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
591861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
591961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
592061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame) {
592161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFilledLen = 0;
592261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL,
592361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL);
592461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = NULL;
592561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
592661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
592761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
59288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("In fill Buffer done call address %p ",buffer);
592961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_BUFFER_LOG
593061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (outputBufferFile1 && buffer->nFilledLen) {
593161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int buf_index = buffer - m_out_mem_ptr;
593261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int stride = drv_ctx.video_resolution.stride;
593361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int scanlines = drv_ctx.video_resolution.scan_lines;
593461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
593561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int i;
593661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int bytes_written = 0;
593761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
593861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
593961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp += stride;
594061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
594161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
594261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int stride_c = stride;
594361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
594461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
594561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp += stride_c;
594661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
594761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
594961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
595061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* For use buffer we need to copy the data */
595161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!output_flush_progress) {
595261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.get_next_timestamp(buffer,
595361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
595461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ?true:false);
595561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_debug_timestamp) {
595661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
595761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_TICKS expected_ts = 0;
595861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_timestamp_list.pop_min_ts(expected_ts);
59598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
596061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nTimeStamp, expected_ts);
596161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
596261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (buffer->nTimeStamp != expected_ts) {
59638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check");
596461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
596561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
596661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
596861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_cb.FillBufferDone) {
596961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFilledLen > 0) {
597061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            handle_extradata(buffer);
597161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (client_extradata & OMX_TIMEINFO_EXTRADATA)
597261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep min timestamp interval to handle corrupted bit stream scenario
597361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                set_frame_rate(buffer->nTimeStamp);
597461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (arbitrary_bytes)
597561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                adjust_timestamp(buffer->nTimeStamp);
597661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (perf_flag) {
597761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!proc_frms) {
597861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    dec_time.stop();
597961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    latency = dec_time.processing_time_us() - latency;
598061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
598161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    dec_time.start();
598261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fps_metrics.start();
598361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
598461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                proc_frms++;
598561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
598661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_U64 proc_time = 0;
598761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fps_metrics.stop();
598861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    proc_time = fps_metrics.processing_time_us();
598961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
599061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            proc_frms, (float)proc_time / 1e6,
599161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (float)(1e6 * proc_frms) / proc_time);
599261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    proc_frms = 0;
599361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
599461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
599561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
599661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_EXTRADATA_LOG
599761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (outputExtradataFile) {
599861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
599961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
600061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                p_extra = (OMX_OTHER_EXTRADATATYPE *)
600161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((unsigned)(buffer->pBuffer + buffer->nOffset +
600261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nFilledLen + 3)&(~3));
600361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                while (p_extra &&
600461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) {
60058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
600661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
600761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p_extra->eType == OMX_ExtraDataNone) {
600861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
600961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
601061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
601161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
601261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
601361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
601461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
601561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
601661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts = LLONG_MAX;
601761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rst_prev_ts = true;
601861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
601961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
602061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
602161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
602261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             buffer->pPlatformPrivate)->entryList->entry;
60238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
602461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *il_buffer;
602561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        il_buffer = client_buffers.get_il_buf_hdr(buffer);
602661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (il_buffer)
602761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
602861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else {
602961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
603061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
603161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
60328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
603361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
603461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
60356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
6036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
603761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
604161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE* buffer)
6042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
604461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) {
60458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer);
604661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
60498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
605061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer, buffer->pBuffer);
6051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_input_buffers--;
6052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
605361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
605461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame == NULL && input_flush_progress == false) {
60558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer);
605661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = buffer;
605761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen = 0;
605861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nTimeStamp = LLONG_MAX;
605961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            push_input_buffer (hComp);
606061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
60618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer);
606261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen = 0;
606361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_input_free_q.insert_entry((unsigned)buffer,
606461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned)NULL, (unsigned)NULL)) {
60658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error");
606661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
6067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
606861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_cb.EmptyBufferDone) {
6069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nFilledLen = 0;
607061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (input_use_buffer == true) {
6071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
6072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
6074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
6076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message)
6079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
608061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec* omx = NULL;
608161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_msginfo *vdec_msg = NULL;
608261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
608361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer *v4l2_buf_ptr = NULL;
608461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_output_frameinfo *output_respbuf = NULL;
608561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc=1;
608661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (context == NULL || message == NULL) {
60878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check");
608861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
608961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
609061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    vdec_msg = (struct vdec_msginfo *)message;
609161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
609261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = reinterpret_cast<omx_vdec*>(context);
609361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
609461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (vdec_msg->msgcode) {
609561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
609661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_HW_ERROR:
609761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
609861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
609961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
610061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
610161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_START_DONE:
610261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
610361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_START_DONE);
610461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
610561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
610661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_STOP_DONE:
610761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
610861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_STOP_DONE);
610961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
611061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
611161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_RESUME_DONE:
611261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
611361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_RESUME_DONE);
611461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
611561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
611661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_PAUSE_DONE:
611761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
611861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_PAUSE_DONE);
611961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
612061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
612161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
612261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
612361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
612461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
612561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
612661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
612761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
612861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
612961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_INPUT_FLUSHED:
613061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
613161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
613261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* omxhdr = (OMX_BUFFERHEADERTYPE* )
613361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan               vdec_msg->msgdata.input_frame_clientdata; */
613461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
613561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
613661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
613761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (omxhdr == NULL ||
613861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) {
613961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omxhdr = NULL;
614061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg->status_code = VDEC_S_EFATAL;
614161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
614261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
614361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
614461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EBD);
614561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
614661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
614761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int64_t *timestamp;
614861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            timestamp = (int64_t *) malloc(sizeof(int64_t));
614961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (timestamp) {
615061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
615161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
615261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
61538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Field dropped time stamp is %lld",
615461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        vdec_msg->msgdata.output_frame.time_stamp);
615561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
615661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
615761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_OUTPUT_FLUSHED:
615861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
615961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
616061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
616161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
616261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
616361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
616461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg->msgdata.output_frame.pic_type);
616561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
616661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (omxhdr && omxhdr->pOutputPortPrivate &&
616761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
616861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
616961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) {
617061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen) {
617161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
617261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
617361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
617461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags;
617561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
61768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) {
617761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
617861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        //rc = -1;
617961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
618061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
618161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
618261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
618361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg->msgdata.output_frame.bufferaddr =
618461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
618561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft !=
618661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    vdec_msg->msgdata.output_frame.framesize.left)
618761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top)
618861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right)
618961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) {
619061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
619161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top;
619261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
619361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
61948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("Crop information has changed");
619561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop,
619661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
619761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
619861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf = (struct vdec_output_frameinfo *)\
619961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     omxhdr->pOutputPortPrivate;
620061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf->len = vdec_msg->msgdata.output_frame.len;
620161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
620261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
620361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_I;
620461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
620561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
620661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_P;
620761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
620861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
620961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_B;
621061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
621161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
621261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (omx->output_use_buffer)
621361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        memcpy ( omxhdr->pBuffer, (void *)
621461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
621561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 (unsigned long)vdec_msg->msgdata.output_frame.offset),
621661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                vdec_msg->msgdata.output_frame.len);
621761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
621861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFilledLen = 0;
621961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
622061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_FBD);
622161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
622261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
622361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EOS_DONE);
622461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else
622561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
622661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
622761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
622861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_CONFIG_CHANGED:
62298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Port settings changed");
623061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
623161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_PORT_RECONFIG);
623261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
623361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
623461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
62358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Port settings changed info");
623661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // get_buffer_req and populate port defn structure
623761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ERRORTYPE eRet = OMX_ErrorNone;
623861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_format fmt;
623961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int ret;
624061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
624161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
624261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height);
624361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->drv_ctx.video_resolution.stride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline;
624461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->drv_ctx.video_resolution.scan_lines = fmt.fmt.pix_mp.plane_fmt[0].reserved[0];
624561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->m_port_def.nPortIndex = 1;
624661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = omx->update_portdef(&(omx->m_port_def));
624761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
624861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
624961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
625061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
625161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
625261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
625361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
625461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
6255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
625861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_HANDLETYPE hComp,
625961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *buffer
626061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
6261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
626261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
62638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Empty this arbitrary");
626461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
626561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
626661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
626761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
62688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
62698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
627061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
627161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
627261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return zero length and not an EOS buffer */
627361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return buffer if input flush in progress */
627461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
627561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
62768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress");
627761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
627861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
627961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
628061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
628161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (psource_frame == NULL) {
62828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
628361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = buffer;
62848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Try to Push One Input Buffer ");
628561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        push_input_buffer (hComp);
628661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
62878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer);
628861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL,
628961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL)) {
629061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
629161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
629261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
629361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
629461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
6296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
6299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
630061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
630161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
630261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
630361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pdest_frame == NULL || psource_frame == NULL) {
630461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if we have a destination buffer*/
630561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame == NULL) {
63068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Get a Destination buffer from the queue");
630761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_free_q.m_size) {
630861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_free_q.pop_entry(&address,&p2,&id);
630961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
631061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen = 0;
631161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = LLONG_MAX;
63128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame);
631361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
631461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
631561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
631661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if we have a destination buffer*/
631761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame == NULL) {
63188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Get a source buffer from the queue");
631961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_pending_q.m_size) {
632061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_pending_q.pop_entry(&address,&p2,&id);
632161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame = (OMX_BUFFERHEADERTYPE *)address;
63228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame,
632361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nTimeStamp);
63248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer flag %d length %d",
632561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nFlags,psource_frame->nFilledLen);
632661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
632761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
632861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
632961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
633061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
633161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
633261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while ((pdest_frame != NULL) && (psource_frame != NULL)) {
633361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_type_parse) {
633461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_MPEG4:
633561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_H263:
633661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_MPEG2:
633761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret =  push_input_sc_codec(hComp);
633861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
633961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_H264:
634061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_h264(hComp);
634161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
634261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_HEVC:
634361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_hevc(hComp);
634461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
634561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_VC1:
634661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_vc1(hComp);
634761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
634861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
634961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
635061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
635161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret != OMX_ErrorNone) {
63528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Pushing input Buffer Failed");
635361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx_report_error ();
635461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
635561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
635661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
635761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
635861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
6359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
6362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
636361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
636461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
636561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
6366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
63678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %d",
636861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame,psource_frame->nTimeStamp);
636961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_frame_parser.parse_sc_frame(psource_frame,
637061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame,&partial_frame) == -1) {
63718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error In Parsing Return Error");
637261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
637461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
637561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
63768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Frame size %d source %p frame count %d",
637761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen,psource_frame,frame_count);
637861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
637961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
63808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("TimeStamp updated %d",pdest_frame->nTimeStamp);
638161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*First Parsed buffer will have only header Hence skip*/
638261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (frame_count == 0) {
63838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame ");
638461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
638561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (codec_type_parse == CODEC_TYPE_MPEG4 ||
638661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    codec_type_parse == CODEC_TYPE_DIVX) {
638761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mp4StreamType psBits;
638861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
638961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psBits.numBytes = pdest_frame->nFilledLen;
639061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mp4_headerparser.parseHeader(&psBits);
639161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
639261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
639361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_count++;
639461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
639561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
639661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame->nFilledLen) {
639761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
639861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
639961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
640061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
640161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
640261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
640361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
640461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_input_free_q.m_size) {
640561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_input_free_q.pop_entry(&address,&p2,&id);
640661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
640761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen = 0;
640861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
640961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
64108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Zero len buffer return back to POOL");
641161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL,
641261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned)NULL);
641361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
641461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
641561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
641661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
64178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Not a Complete Frame %d",pdest_frame->nFilledLen);
641861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
641961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame->nAllocLen ==
642061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen + pdest_frame->nOffset) {
64218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled");
642261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
642361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
642461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
642561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
642661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (psource_frame->nFilledLen == 0) {
642761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
642861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
642961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags |= psource_frame->nFlags;
64308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x",
643161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
64328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Found a frame size = %d number = %d",
643361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,frame_count++);
643461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
643561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
643661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
643761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
643861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
643961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
644061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
64418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr") ;
644261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
644361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
644461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
644561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (generate_ebd) {
64468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame);
644761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
644861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
644961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
645061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_pending_q.m_size) {
64518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
645261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_pending_q.pop_entry(&address,&p2,&id);
645361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame = (OMX_BUFFERHEADERTYPE *) address;
64548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame,
645561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nTimeStamp);
64568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer flag %d length %d",
645761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nFlags,psource_frame->nFilledLen);
645861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
645961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
646061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
646161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
6465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
646661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
646761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
646861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL isNewFrame = OMX_FALSE;
646961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
647061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
647161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer == NULL) {
64728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated");
647361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
64758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %d "
647661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
64778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
647861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.nFilledLen && look_ahead_nal) {
647961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
648061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
648161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen) {
6482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
6483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
6484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
64858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame");
6486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_scratch.nFilledLen = 0;
648761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
64888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264");
6489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
6490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
649161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
649261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nal_length == 0) {
64938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Zero NAL, hence parse using start code");
649461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_sc_frame(psource_frame,
649561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
64968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
6497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
6498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
649961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
65008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
650161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_h264_nallength(psource_frame,
650261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
65038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
650461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
6505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
650661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
6507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
650861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
650961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
65108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
651161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_count++;
651261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
651361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFlags = psource_frame->nFlags;
651461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
65158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen);
651661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.nFilledLen) {
651761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
651861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        NALU_TYPE_SPS);
6519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
652061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (client_extradata & OMX_TIMEINFO_EXTRADATA)
652161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
652261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
652361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
652461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // If timeinfo is present frame info from SEI is already processed
652561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
652661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
652761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
652861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
652961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_count++;
653061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
653161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nTimeStamp = h264_last_au_ts;
653261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFlags = h264_last_au_flags;
653361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef PANSCAN_HDLR
653461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
653561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_parser->update_panscan_data(h264_last_au_ts);
653661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
653761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
653861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
653961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
654061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_ts = h264_scratch.nTimeStamp;
654161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_flags = h264_scratch.nFlags;
654261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
654361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
654461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
654561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!VALID_TS(h264_last_au_ts))
654661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_last_au_ts = ts_in_sei;
654761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
654861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
654961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
655061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_ts = LLONG_MAX;
655161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
655261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
655361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!isNewFrame) {
655461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
655561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen) {
65568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %d",
655761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen);
655861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
655961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
656061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
656161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
656261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
656361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.nFilledLen = 0;
656461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
65658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264");
656661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
656761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
656861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
656961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                look_ahead_nal = true;
65708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x",
657161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
65728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Found a frame size = %d number = %d",
657361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,frame_count++);
657461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
657561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pdest_frame->nFilledLen == 0) {
65768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Copy the Current Frame since and push it");
657761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    look_ahead_nal = false;
657861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
657961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen) {
658061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
658161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                h264_scratch.pBuffer,h264_scratch.nFilledLen);
658261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
658361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen = 0;
658461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
65858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264");
658661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
658761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
658861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
658961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
65908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("Reset the EOS Flag");
659161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
659261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
659361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    /*Push the frame to the Decoder*/
659461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
659561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
659661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
659761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    //frame_count++;
659861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = NULL;
659961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_input_free_q.m_size) {
660061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_input_free_q.pop_entry(&address,&p2,&id);
660161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
66028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame);
660361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen = 0;
660461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags = 0;
660561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = LLONG_MAX;
660661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
660761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
660861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
660961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
661061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
66118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
661261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
661361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (h264_scratch.nAllocLen ==
661461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen + h264_scratch.nOffset) {
66158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
661661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
6617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
661861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
661961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
662061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!psource_frame->nFilledLen) {
66218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
662261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
662361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
662461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
66258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
662661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
662761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen) {
662861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
662961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
663061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
663161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.nFilledLen = 0;
663261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
66338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264");
663461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
663561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
663661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
663761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
663861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
66398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%d TimeStamp = %x",
664061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
66418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++);
664261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
664361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
664461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
664561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!VALID_TS(pdest_frame->nTimeStamp))
664661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = ts_in_sei;
664761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
6648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
664961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
665061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
665161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
665261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
665361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
665461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
665561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
66568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d",
665761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame,h264_scratch.nFilledLen);
665861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
665961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
666061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
666161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
666261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (generate_ebd && !psource_frame->nFilledLen) {
666361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
666461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = NULL;
666561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_input_pending_q.m_size) {
66668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
666761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&address,&p2,&id);
666861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
66698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Next source Buffer flag %d src length %d",
667061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    psource_frame->nFlags,psource_frame->nFilledLen);
667161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
667261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
667361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
66766eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc)
6677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
66786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_ERRORTYPE rc = OMX_ErrorNone;
667961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) {
66806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        memcpy ((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen);
66818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pDst->nTimeStamp == LLONG_MAX) {
66826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            pDst->nTimeStamp = pSrc->nTimeStamp;
66836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            DEBUG_PRINT_LOW("Assign Dst nTimeStamp=%lld", pDst->nTimeStamp);
6684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
66856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        pDst->nFilledLen += pSrc->nFilledLen;
66866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        pSrc->nFilledLen = 0;
668761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
66888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Destination buffer overflow");
66896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        rc = OMX_ErrorBadParameter;
6690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
66916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return rc;
6692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
66946eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_hevc (OMX_HANDLETYPE hComp)
6695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
669661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
669761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
669861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL isNewFrame = OMX_FALSE;
669961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
670061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE rc = OMX_ErrorNone;
670161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
670261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer == NULL) {
67038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated");
670461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
67056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
670661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
670761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
67088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("h264_scratch.nFilledLen %d has look_ahead_nal %d pdest_frame nFilledLen %d nTimeStamp %lld",
670961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFilledLen, look_ahead_nal, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
671061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
671161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.nFilledLen && look_ahead_nal) {
671261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
671361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
671461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // copy the lookahead buffer in the scratch
67156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        rc = copy_buffer(pdest_frame, &h264_scratch);
671661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc != OMX_ErrorNone) {
671761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc;
671861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
671961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
672061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nal_length == 0) {
672161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_sc_frame(psource_frame,
672261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
67238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
67246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            return OMX_ErrorBadParameter;
67256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
672661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
67278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length);
672861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_h264_nallength(psource_frame,
672961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
67308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
67316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            return OMX_ErrorBadParameter;
673261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
673361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
673461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
673561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
673661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
67378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
673861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_count++;
673961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
674061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFlags = psource_frame->nFlags;
674161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
67428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen);
674361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.nFilledLen) {
674461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mHEVCutils.isNewFrame(&h264_scratch, 0, isNewFrame);
674561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_count++;
674661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
674761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
674861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!isNewFrame) {
67498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %d nTimestamp %lld, pdest_frame nFilledLen %d nTimestamp %lld",
675061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen, h264_scratch.nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
675161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc = copy_buffer(pdest_frame, &h264_scratch);
675261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( rc != OMX_ErrorNone) {
675361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return rc;
675461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
675561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
675661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                look_ahead_nal = true;
675761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pdest_frame->nFilledLen == 0) {
675861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    look_ahead_nal = false;
67598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer");
676061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    rc = copy_buffer(pdest_frame, &h264_scratch);
676161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( rc != OMX_ErrorNone ) {
676261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
676361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
676461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
676561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
676661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
676761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
676861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
67698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("FrameDetecetd # %d pdest_frame nFilledLen %d nTimeStamp %lld, look_ahead_nal in h264_scratch nFilledLen %d nTimeStamp %lld",
677061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            frame_count++, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
677161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
677261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
677361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
677461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = NULL;
677561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_input_free_q.m_size) {
677661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_input_free_q.pop_entry(&address,&p2,&id);
677761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
67788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("pop the next pdest_buffer %p",pdest_frame);
677961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen = 0;
678061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags = 0;
678161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = LLONG_MAX;
678261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
678361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
678461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
678561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
678661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
67878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %d nTimeStamp %lld, pdest_frame nFilledLen %d nTimeStamp %lld, h264_scratch nFilledLen %d nTimeStamp %lld",
678861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame->nFilledLen, psource_frame->nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
678961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
679061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
679161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (h264_scratch.nAllocLen ==
679261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen + h264_scratch.nOffset) {
67938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
679461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
679561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
679661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
679761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
679861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!psource_frame->nFilledLen) {
67998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
680061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
680161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
680261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
68038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
680461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc = copy_buffer(pdest_frame, &h264_scratch);
680561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( rc != OMX_ErrorNone ) {
680661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return rc;
680761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
680861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
680961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
681061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%d TimeStamp = %lld",
681261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frame_count, pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
681361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
681461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
681561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
681661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
681761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
681861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
681961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
682061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
68218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d",
682261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame,h264_scratch.nFilledLen);
682361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
682461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
682561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
682661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
682761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (generate_ebd && !psource_frame->nFilledLen) {
682861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
682961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = NULL;
683061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_input_pending_q.m_size) {
683161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&address,&p2,&id);
683261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
68338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Next source Buffer flag %d nFilledLen %d, nTimeStamp %lld",
683461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    psource_frame->nFlags,psource_frame->nFilledLen, psource_frame->nTimeStamp);
683561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
683661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
683761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
68386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
68396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
68406eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
68416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
68426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_U8 *buf, *pdest;
68436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_U32 partial_frame = 1;
68446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_U32 buf_len, dest_len;
68456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
684661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (first_frame == 0) {
68476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        first_frame = 1;
68488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes");
684961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_vendor_config.pData) {
68508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Check profile type in 1st source buffer");
68516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            buf = psource_frame->pBuffer;
68526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            buf_len = psource_frame->nFilledLen;
68536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
68546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
685561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    VC1_SP_MP_START_CODE) {
68566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                m_vc1_profile = VC1_SP_MP_RCV;
685761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
68586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                m_vc1_profile = VC1_AP;
685961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
68608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer");
68616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                return OMX_ErrorStreamCorrupt;
68626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
686361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
68646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
68656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                pdest_frame->nOffset;
68666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
686761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nOffset);
68686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
686961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (dest_len < m_vendor_config.nDataSize) {
68708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Destination buffer full");
68716eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                return OMX_ErrorBadParameter;
687261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
68736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
68746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
68756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
68766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
68776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
68786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
687961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (m_vc1_profile) {
68806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        case VC1_AP:
68818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code");
688261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
68838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code");
68846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                return OMX_ErrorBadParameter;
68856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
688661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
68876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
68886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        case VC1_SP_MP_RCV:
68896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        default:
68908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode");
68916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            return OMX_ErrorBadParameter;
68926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
68936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return OMX_ErrorNone;
68946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
68956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
689661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
689761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 alignment)
689861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
689961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem_allocation allocation;
690061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.size = buffer_size;
690161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.align = clip2(alignment);
690261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocation.align < 4096) {
690361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocation.align = 4096;
690461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
690561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
69068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)",
690761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                allocation.align, allocation.size);
690861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
690961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
691061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
691161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
69126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
69136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
691461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 alignment, struct ion_allocation_data *alloc_data,
691561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct ion_fd_data *fd_data, int flag)
69166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
691761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fd = -EINVAL;
691861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = -EINVAL;
691961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ion_dev_flag;
692061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_ion ion_buf_info;
692161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!alloc_data || buffer_size <= 0 || !fd_data) {
69228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory");
692361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -EINVAL;
692461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
692561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ion_dev_flag = O_RDONLY;
692661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fd = open (MEM_DEVICE, ion_dev_flag);
692761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
69288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd);
692961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return fd;
693061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
693161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->flags = 0;
693261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!secure_mode && (flag & ION_FLAG_CACHED)) {
693361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->flags |= ION_FLAG_CACHED;
693461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
693561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->len = buffer_size;
693661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->align = clip2(alignment);
693761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (alloc_data->align < 4096) {
693861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->align = 4096;
693961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
694061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((secure_mode) && (flag & ION_SECURE))
694161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->flags |= ION_SECURE;
694261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
694361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_
69449157b7d2c90c853713840ce85a78f5d22600fe1ePraveen Chavan    alloc_data->ION_HEAP_MASK = ION_HEAP(ION_ADSP_HEAP_ID);
694561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else
69469157b7d2c90c853713840ce85a78f5d22600fe1ePraveen Chavan    alloc_data->ION_HEAP_MASK = ION_HEAP(ION_IOMMU_HEAP_ID);
694761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
694861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (secure_mode) {
69499157b7d2c90c853713840ce85a78f5d22600fe1ePraveen Chavan        alloc_data->ION_HEAP_MASK = ION_HEAP(MEM_HEAP_ID);
695061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
695161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
695261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc || !alloc_data->handle) {
69538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION ALLOC memory failed ");
695461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->handle = NULL;
695561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(fd);
695661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd = -ENOMEM;
695761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return fd;
695861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
695961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fd_data->handle = alloc_data->handle;
696061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(fd,ION_IOC_MAP,fd_data);
696161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
69628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION MAP failed ");
696361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.ion_alloc_data = *alloc_data;
696461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.ion_device_fd = fd;
696561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.fd_ion_data = *fd_data;
696661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_ion_memory(&ion_buf_info);
696761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd_data->fd =-1;
696861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd = -ENOMEM;
696961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
697061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return fd;
6972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
697461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
6975dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
697661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
697761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!buf_ion_info) {
69788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata");
697961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
698061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
698161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
698261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &buf_ion_info->ion_alloc_data.handle)) {
69838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION: free failed" );
698461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
698561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    close(buf_ion_info->ion_device_fd);
698661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->ion_device_fd = -1;
698761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->ion_alloc_data.handle = NULL;
698861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->fd_ion_data.fd = -1;
6989dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
6990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header()
6992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
69938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ALL output buffers are freed/released");
699461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_use_buffer = false;
699561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers = false;
699661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
699761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
699861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (m_out_mem_ptr);
699961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = NULL;
700061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
700161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
700261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_platform_list) {
700361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(m_platform_list);
700461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_platform_list = NULL;
700561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
700661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
700761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_respbuffer) {
700861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_respbuffer);
700961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = NULL;
701061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
701161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_outputbuffer) {
701261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_outputbuffer);
701361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = NULL;
701461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
70178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free o/p ion context");
701861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(drv_ctx.op_buf_ion_info);
7019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
7020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header()
7025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = false;
702761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
702861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils) {
70298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free utils parser");
703061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            delete (m_frame_parser.mutils);
703161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils = NULL;
703261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
703361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
703461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr) {
70358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free input Heap Pointer");
703661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free (m_inp_heap_ptr);
703761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_heap_ptr = NULL;
703861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
703961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
704061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_phdr_pmem_ptr) {
70418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free input pmem header Pointer");
704261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free (m_phdr_pmem_ptr);
704361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_phdr_pmem_ptr = NULL;
704461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
704561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
704661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr) {
70478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free input pmem Pointer area");
704861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (m_inp_mem_ptr);
704961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_mem_ptr = NULL;
705061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
705161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_inputbuffer) {
70528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Driver Context pointer");
705361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_inputbuffer);
705461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer = NULL;
7055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info) {
70588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free ion context");
705961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(drv_ctx.ip_buf_ion_info);
7060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ip_buf_ion_info = NULL;
7061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
70646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
70656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::stream_off(OMX_U32 port)
7066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
706761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enum v4l2_buf_type btype;
706861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
706961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enum v4l2_ports v4l2_port = OUTPUT_PORT;
707061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
707161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
707261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
707361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        v4l2_port = OUTPUT_PORT;
707461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
707561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
707661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        v4l2_port = CAPTURE_PORT;
707761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_ALL) {
707861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
707961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
708061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
708161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc_input)
708261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc_input;
708361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
708461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc_output;
708561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
708661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
708761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!streaming[v4l2_port]) {
708861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // already streamed off, warn and move on
708961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
709061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                " which is already streamed off", v4l2_port);
709161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return 0;
709261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
709361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
709461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
709561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
709661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
709761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
709861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
70998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port);
710061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
710161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        streaming[v4l2_port] = false;
710261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
710361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
710461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
710561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
710661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
710761a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
710861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
710961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
711061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
711161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
711261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
711361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret = 0;
711461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
711561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.memory = V4L2_MEMORY_USERPTR;
711661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.count = 1;
711761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
711861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
711961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
712061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
712161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
712261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
712361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
712461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
712561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
712661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadParameter;
712761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
712861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet==OMX_ErrorNone) {
712961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
713061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
713161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
713261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
713361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
713461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
713561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
713661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
713761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->actualcount = bufreq.count;
713861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->mincount = bufreq.count;
71398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Count = %d",bufreq.count);
714061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
714161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("GetBufReq: ActCnt(%d) Size(%d), BufType(%d)",
714261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
714361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
714461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
714561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
714661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
714761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
714861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
714961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height);
715061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
715161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
71528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Buffer Size (plane[0].sizeimage) = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
715361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
715461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
715561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
715661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
715761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
715861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
715961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int extra_idx = 0;
716061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
716161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size = buffer_prop->buffer_size;
716261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
716361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
716461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
716561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (extra_idx >= VIDEO_MAX_PLANES) {
71668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
716761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
716861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
716961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
717061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Frame info extra data enabled!");
717161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
717261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
717361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extradata & OMX_INTERLACE_EXTRADATA) {
717461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
717561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
717661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extradata & OMX_PORTDEF_EXTRADATA) {
717761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
71788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d",
717961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    client_extra_data_size);
718061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
718161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extra_data_size) {
718261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
718361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
718461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
718561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size;
718661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.count = buffer_prop->actualcount;
718761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.buffer_size = extra_data_size;
718861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size += client_extra_data_size;
718961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
719061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d)",
719161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type);
719261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (in_reconfig) // BufReq will be set to driver when port is disabled
719361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->buffer_size = buf_size;
719461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (buf_size != buffer_prop->buffer_size) {
719561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->buffer_size = buf_size;
719661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = set_buffer_req(buffer_prop);
719761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
719861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
71998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("GetBufReq OUT: ActCnt(%d) Size(%d), BufType(%d)",
720061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
720161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
720461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
720561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
720661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
720761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned buf_size = 0;
720861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
720961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
721061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret;
721161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
721261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size);
721361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
721461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buf_size != buffer_prop->buffer_size) {
721561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
721661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_prop->buffer_size, buf_size);
721761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadParameter;
721861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
721961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
722061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
722161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
722261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
722361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
722461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.pixelformat = output_capability;
722561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
722661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
722761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.pixelformat = capture_capability;
722861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
722961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
723061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
723161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
723261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
723361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
723461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
723561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
723661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
723761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
723861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
723961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
724061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.count = buffer_prop->actualcount;
724161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
724261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
724361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
724461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
724561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
724661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
724761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
724961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet==OMX_ErrorNone) {
725061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
725161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
725261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
725361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
725461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
725561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
725661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
725761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (bufreq.count < buffer_prop->actualcount) {
725861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
725961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    " on v4l2 port %d to %d (prefers %d)", bufreq.type,
726061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buffer_prop->actualcount, bufreq.count);
726161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
726261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
726361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!client_buffers.update_buffer_req()) {
726461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
726561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
726661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
726761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
726861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
726961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!eRet && buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
727061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // need to update extradata buffers also
727161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = buffer_prop->actualcount * drv_ctx.extradata_info.buffer_size;
727261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.count = buffer_prop->actualcount;
727361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
727461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7275dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
7276dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
7277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution()
7278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
727961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
728061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
7284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
728561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
728661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!portDefn) {
728761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
728861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
72898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("omx_vdec::update_portdef");
729061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
729161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->nSize = sizeof(portDefn);
729261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->eDomain    = OMX_PortDomainVideo;
729361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.frame_rate.fps_denominator > 0)
729461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
729561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.frame_rate.fps_denominator;
729661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
72978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Divide by zero");
729861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
7299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
730061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (0 == portDefn->nPortIndex) {
730161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir =  OMX_DirInput;
730261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
730361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
730461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
730561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
730661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eCompressionFormat = eCompressionFormat;
730761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bEnabled   = m_inp_bEnabled;
730861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bPopulated = m_inp_bPopulated;
730961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (1 == portDefn->nPortIndex) {
731061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int buf_size = 0;
731161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.update_buffer_req()) {
73128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed");
731361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
731461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
731561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.get_buffer_req(buf_size)) {
73168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("update buffer requirements");
731761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
731861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
731961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferSize = buf_size;
732061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir =  OMX_DirOutput;
732161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
732261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
732361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
732461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bEnabled   = m_out_bEnabled;
732561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bPopulated = m_out_bPopulated;
732661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
73278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error in getting color format");
732861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
732961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
733061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
733161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir = OMX_DirMax;
733261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
733361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (int)portDefn->nPortIndex);
733461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
733561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
733661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
733761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
733861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
733961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
734061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld"
73418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            " SliceHeight = %lu", portDefn->format.video.nFrameWidth,
734261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nFrameHeight,
734361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nStride,
734461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nSliceHeight);
734561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers()
7350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
735161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
735261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
735361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i= 0;
735461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
735561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
73568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation");
735761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nBufHdrSize        = 0;
735861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformEntrySize = 0;
735961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformListSize  = 0;
736061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPMEMInfoSize = 0;
736161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
736261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
736361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
736461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Setting First Output Buffer(%d)",
736661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
736761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufHdrSize        = drv_ctx.op_buf.actualcount *
736861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE);
736961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
737061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
737161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
737261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformListSize  = drv_ctx.op_buf.actualcount *
737361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
737461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
737561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
737661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
737861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof(OMX_BUFFERHEADERTYPE),
737961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,
738061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPlatformListSize);
73818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("PE %d bmSize %d",nPlatformEntrySize,
738261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_bm_count);
738361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
738461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Alloc mem for platform specific info
738561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *pPtr=NULL;
738661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
738761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,1);
738861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
738961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   calloc (sizeof(struct vdec_bufferpayload),
739061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.op_buf.actualcount);
739161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
739261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 calloc (sizeof (struct vdec_output_frameinfo),
739361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         drv_ctx.op_buf.actualcount);
7394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
739561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
739661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
7397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
739961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
740061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && drv_ctx.ptr_respbuffer) {
740161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufHdr          =  m_out_mem_ptr;
740261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
740361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
740461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_list)  + nPlatformListSize);
740561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
740661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_entry) + nPlatformEntrySize);
740761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformList   = m_platform_list;
740861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformEntry  = m_platform_entry;
740961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPMEMInfo       = m_pmem_info;
741061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
74118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
741261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
741361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Settting the entire storage nicely
74148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr,
741561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr,pPlatformEntry);
74168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
741761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
741861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
741961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
742061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Set the values when we determine the right HxW param
742161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nAllocLen          = 0;
742261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nFilledLen         = 0;
742361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pAppPrivate        = NULL;
742461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
742561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
742661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->entry      = pPMEMInfo;
742761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform List
742861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->nEntries    = 1;
742961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->entryList   = pPlatformEntry;
743061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep pBuffer NULL till vdec is opened
743161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pBuffer            = NULL;
743261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->offset          =  0;
743361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->pmem_fd = 0;
743461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pPlatformPrivate = pPlatformList;
743561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
7436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
743761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
7438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
743961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Create a mapping between buffers*/
744061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
744161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer[i].client_data = (void *) \
744261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        &drv_ctx.ptr_outputbuffer[i];
744361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Move the buffer and buffer header pointers
744461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr++;
744561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo++;
744661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry++;
744761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList++;
744861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
744961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
74508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
745161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr, pPtr);
745261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_out_mem_ptr) {
745361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_out_mem_ptr);
745461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr = NULL;
745561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
745661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pPtr) {
745761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(pPtr);
745861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPtr = NULL;
745961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
746061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer) {
746161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_outputbuffer);
746261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer = NULL;
746361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
746461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_respbuffer) {
746561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_respbuffer);
746661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer = NULL;
746761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
7468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
746961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.op_buf_ion_info) {
74708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free o/p ion context");
747161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.op_buf_ion_info);
747261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info = NULL;
747361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
7474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
747561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet =  OMX_ErrorInsufficientResources;
747661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
747761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
747861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet =  OMX_ErrorInsufficientResources;
7479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
748061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs()
7484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
748561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned p1;
748661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned p2;
748761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned ident;
748861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_cmd_queue tmp_q, pending_bd_q;
748961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
749061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // pop all pending GENERATE FDB from ftb queue
749161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_ftb_q.m_size) {
749261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.pop_entry(&p1,&p2,&ident);
749361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_FBD) {
749461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_bd_q.insert_entry(p1,p2,ident);
749561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
749661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            tmp_q.insert_entry(p1,p2,ident);
749761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
749961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //return all non GENERATE FDB to ftb queue
750061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (tmp_q.m_size) {
750161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        tmp_q.pop_entry(&p1,&p2,&ident);
750261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.insert_entry(p1,p2,ident);
750361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
750461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // pop all pending GENERATE EDB from etb queue
750561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_etb_q.m_size) {
750661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.pop_entry(&p1,&p2,&ident);
750761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_EBD) {
750861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_bd_q.insert_entry(p1,p2,ident);
750961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
751061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            tmp_q.insert_entry(p1,p2,ident);
751161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
751261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
751361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //return all non GENERATE FDB to etb queue
751461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (tmp_q.m_size) {
751561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        tmp_q.pop_entry(&p1,&p2,&ident);
751661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.insert_entry(p1,p2,ident);
751761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
751861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
751961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // process all pending buffer dones
752061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (pending_bd_q.m_size) {
752161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pending_bd_q.pop_entry(&p1,&p2,&ident);
752261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (ident) {
752361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_COMPONENT_GENERATE_EBD:
752461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
75258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!");
752661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
752761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
752861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
752961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
753061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_COMPONENT_GENERATE_FBD:
753161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
75328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!");
753361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
753461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
753561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
753661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
7541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
754261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 new_frame_interval = 0;
754361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
754461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) {
754561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        new_frame_interval = (act_timestamp > prev_ts)?
754661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            act_timestamp - prev_ts :
754761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts - act_timestamp;
754861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (new_frame_interval < frm_int || frm_int == 0) {
754961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frm_int = new_frame_interval;
755061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (frm_int) {
755161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.frame_rate.fps_numerator = 1e6;
755261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.frame_rate.fps_denominator = frm_int;
755361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
755461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frm_int, drv_ctx.frame_rate.fps_numerator /
755561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (float)drv_ctx.frame_rate.fps_denominator);
755661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
755761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
755861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
755961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prev_ts = act_timestamp;
7560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
7563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
756461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rst_prev_ts && VALID_TS(act_timestamp)) {
756561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = act_timestamp;
756661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = false;
756761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (VALID_TS(prev_ts)) {
756861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool codec_cond = (drv_ctx.timestamp_adjust)?
756961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
757061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
757161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
757261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (frm_int > 0 && codec_cond) {
757361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
757461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            act_timestamp = prev_ts + frm_int;
757561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
757661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts = act_timestamp;
757761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
757861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            set_frame_rate(act_timestamp);
757961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (frm_int > 0)          // In this case the frame rate was set along
758061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    {                               // with the port definition, start ts with 0
758161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
758261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
7583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
7587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
758861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
758961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_conceal_MB = 0;
759061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 frame_rate = 0;
759161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int consumed_len = 0;
759261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_MB_in_frame;
759361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 recovery_sei_flags = 1;
759461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int buf_index = p_buf_hdr - m_out_mem_ptr;
759561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
759661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
759761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        p_buf_hdr->nOffset;
759861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!drv_ctx.extradata_info.uaddr) {
759961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
760061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
760161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    p_extra = (OMX_OTHER_EXTRADATATYPE *)
760261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
760361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
760461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
760561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        p_extra = NULL;
760661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
760761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (data) {
760861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while ((consumed_len < drv_ctx.extradata_info.buffer_size)
76098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) {
761061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) {
761161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("Invalid extra data size");
761261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
761361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
761461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch ((unsigned long)data->eType) {
76158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO:
761661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_interlace_payload *payload;
761761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    payload = (struct msm_vidc_interlace_payload *)data->data;
76188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (payload->format != MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) {
761961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        int enable = 1;
762061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_U32 mbaff = 0;
762161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
76228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if ((payload->format == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
762361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
762461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        else
762561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
762661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (m_enable_android_native_buffers)
762761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
762861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    PP_PARAM_INTERLACED, (void*)&enable);
762961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
763061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) {
763161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        append_interlace_extradata(p_extra, payload->format);
763261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
763361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
763461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_FRAME_RATE:
763661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_framerate_payload *frame_rate_payload;
763761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data;
763861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    frame_rate = frame_rate_payload->frame_rate;
763961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_TIMESTAMP:
764161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_ts_payload *time_stamp_payload;
764261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    time_stamp_payload = (struct msm_vidc_ts_payload *)data->data;
764361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo;
764461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
764561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB:
764761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_concealmb_payload *conceal_mb_payload;
764861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data;
764961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
765061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
765161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
765261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_ASPECT_RATIO:
765461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
765561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)data->data;
765661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((struct vdec_output_frameinfo *)
765761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
765861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((struct vdec_output_frameinfo *)
765961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
766061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI:
766261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_recoverysei_payload *recovery_sei_payload;
766361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data;
766461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    recovery_sei_flags = recovery_sei_payload->flags;
76658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) {
766661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
76678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("Extradata: OMX_BUFFERFLAG_DATACORRUPT Received");
766861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
766961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW:
767161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data;
767261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
767361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
767461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    goto unrecognized_extradata;
767561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
767661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            consumed_len += data->nSize;
767761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
767861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
767961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
768061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
768161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            append_frame_info_extradata(p_extra,
768261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
768361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    panscan_payload,&((struct vdec_output_frameinfo *)
768461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
768561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
768661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
76876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalunrecognized_extradata:
768861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!secure_mode && client_extradata)
768961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        append_terminator_extradata(p_extra);
769061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
7691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
76936eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
769461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool is_internal, bool enable)
7695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
769661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
769761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
769861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state != OMX_StateLoaded) {
769961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
770061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
770161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
77028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d",
770361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata, requested_extradata, enable, is_internal);
770461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
770561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!is_internal) {
770661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (enable)
770761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata |= requested_extradata;
770861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
770961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata = client_extradata & ~requested_extradata;
771061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
771161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
771261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enable) {
771361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
771461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
771561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
771661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
771761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
77188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        " Quality of interlaced clips might be impacted.");
771961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
772061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) {
772161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
772261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
772361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set framerate extradata");
772561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
772661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
772761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
772861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set concealed MB extradata");
773061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
773161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
773261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
773361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata");
773561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
773661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
773761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
773861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
774061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
774161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
77428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO;
774361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
774561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
774661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
774761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
774861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
774961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set timeinfo extradata");
775161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
775261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
775361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
775461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = get_buffer_req(&drv_ctx.op_buf);
775561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
7756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
776061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
776161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *data_ptr = extra->data, data = 0;
776261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (byte_count < extra->nDataSize) {
776361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        data = *data_ptr;
776461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (data) {
776561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            num_MB += (data&0x01);
776661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            data >>= 1;
776761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
776861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        data_ptr++;
776961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        byte_count++;
777061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
777161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
777261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
777361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
7774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
777861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_debug_extradata)
777961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
7780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
778261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "============== Extra Data ==============\n"
778361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "           Size: %lu \n"
778461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "        Version: %lu \n"
778561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "      PortIndex: %lu \n"
778661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "           Type: %x \n"
77878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "       DataSize: %lu",
778861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra->nSize, extra->nVersion.nVersion,
778961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra->nPortIndex, extra->eType, extra->nDataSize);
779061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
779161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) {
779261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
779361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH(
779461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "------ Interlace Format ------\n"
779561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "                Size: %lu \n"
779661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "             Version: %lu \n"
779761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "           PortIndex: %lu \n"
779861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                " Is Interlace Format: %d \n"
779961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "   Interlace Formats: %lu \n"
78008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "=========== End of Interlace ===========",
780161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
780261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
780361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) {
780461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
780561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
780661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH(
780761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "-------- Frame Format --------\n"
780861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "             Picture Type: %d \n"
780961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "           Interlace Type: %d \n"
781061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                " Pan Scan Total Frame Num: %lu \n"
781161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "   Concealed Macro Blocks: %lu \n"
781261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "               frame rate: %lu \n"
781361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "           Aspect Ratio X: %lu \n"
78148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "           Aspect Ratio Y: %lu",
781561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->ePicType,
781661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->interlaceType,
781761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->panScan.numWindows,
781861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->nConcealedMacroblocks,
781961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->nFrameRate,
782061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->aspectRatio.aspectRatioX,
782161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->aspectRatio.aspectRatioY);
782261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
782361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) {
782461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH(
782561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "------------------------------\n"
782661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "     Pan Scan Frame Num: %lu \n"
782761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "            Rectangle x: %ld \n"
782861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "            Rectangle y: %ld \n"
782961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "           Rectangle dx: %ld \n"
78308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    "           Rectangle dy: %ld",
783161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
783261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
783361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
783461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
783561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
783661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra->eType == OMX_ExtraDataNone) {
783761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("========== End of Terminator ===========");
783861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
783961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
784061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
784461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 interlaced_format_type)
7845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
784661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_STREAMINTERLACEFORMAT *interlace_format;
784761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 mbaff = 0;
784861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
784961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
785061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
785161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
785261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
785361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
785461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
785561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
785661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
785761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
785861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
785961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
786061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
78618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE)  && !mbaff) {
786261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->bInterlaceFormat = OMX_FALSE;
786361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
786461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
786561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
786661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->bInterlaceFormat = OMX_TRUE;
786761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
786861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
786961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
787061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
7871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
78736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::fill_aspect_ratio_info(
787461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct vdec_aspectratioinfo *aspect_ratio_info,
787561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
78766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
787761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata = frame_info;
787861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
787961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
788061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX,
788161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_extradata->aspectRatio.aspectRatioY);
78826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
7883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
788561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
78866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        struct msm_vidc_panscan_window_payload *panscan_payload,
78876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        struct vdec_aspectratioinfo *aspect_ratio_info)
7888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
788961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
789061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct msm_vidc_panscan_window *panscan_window;
789161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
78926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        return;
789361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
789461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
789561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
789661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
789761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
789861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
789961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
790061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (picture_type) {
790161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_I:
790261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeI;
790361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
790461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_P:
790561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeP;
790661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
790761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_B:
790861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeB;
790961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
791061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
791161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
791261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
791361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
791461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
791561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
791661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
791761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
791861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
791961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
792061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->nConcealedMacroblocks = num_conceal_mb;
792161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->nFrameRate = frame_rate;
792261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->panScan.numWindows = 0;
792361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (panscan_payload) {
792461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
792561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        panscan_window = &panscan_payload->wnd[0];
792661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) {
792761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
792861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
792961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
793061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
793161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            panscan_window++;
793261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
793361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
793461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fill_aspect_ratio_info(aspect_ratio_info, frame_info);
793561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
794061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
794161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
794261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
794361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
794461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
794561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
794661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
794761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *portDefn = m_port_def;
794861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
79498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "sliceheight = %u",portDefn->format.video.nFrameHeight,
795061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nFrameWidth,
795161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nStride,
795261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nSliceHeight);
7953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
795761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!client_extradata) {
795861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
795961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
796061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
796161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
796261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = OMX_ExtraDataNone;
796361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = 0;
796461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->data[0] = 0;
796561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
796661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
7967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
7970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
797161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
797261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index >= drv_ctx.ip_buf.actualcount) {
79738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found");
797461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
797561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
797661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr == NULL) {
797761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_desc_buffer_ptr = (desc_buffer_hdr*) \
797861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            calloc( (sizeof(desc_buffer_hdr)),
797961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    drv_ctx.ip_buf.actualcount);
798061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_desc_buffer_ptr == NULL) {
79818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed ");
798261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
798361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
798461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
798561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
798661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
798761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr[index].buf_addr == NULL) {
79888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("desc buffer Allocation failed ");
798961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
799061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
799161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
799261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
7996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
799761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
799861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_demux_entries < 8192) {
799961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_offsets[m_demux_entries++] = address_offset;
800061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
800161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
8002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
8005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
800661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
800761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
800861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 index = 0;
800961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
801061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
801161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
801261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (index < bytes_to_parse) {
801361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
801461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
801561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
801661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 (buf[index+2] == 0x01)) ) {
801761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //Found start code, insert address offset
801861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            insert_demux_addr_offset(index);
801961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buf[index+2] == 0x01) // 3 byte start code
802061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index += 3;
802161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else                      //4 byte start code
802261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index += 4;
802361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
802461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            index++;
8025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
802661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
802761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
8028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
8031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
803261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //fix this, handle 3 byte start code, vc1 terminator entry
803361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *p_demux_data = NULL;
803461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 desc_data = 0;
803561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 start_addr = 0;
803661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 nal_size = 0;
803761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 suffix_byte = 0;
803861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 demux_index = 0;
803961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 buffer_index = 0;
804061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
804161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr == NULL) {
804261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
804361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
804461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
804561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
804661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
804761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_index > drv_ctx.ip_buf.actualcount) {
804861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index);
804961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
805061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
805161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
805261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
805361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
805461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ( ((OMX_U8*)p_demux_data == NULL) ||
805561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
805661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
805761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
805861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
805961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; demux_index < m_demux_entries; demux_index++) {
806061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0;
806161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            start_addr = m_demux_offsets[demux_index];
806261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
806361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
806461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
806561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
806661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
806761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (demux_index < (m_demux_entries - 1)) {
806861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
806961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
807061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
807161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
807261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
807361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    start_addr,
807461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    suffix_byte,
807561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    nal_size,
807661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    demux_index);
807761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = (start_addr >> 3) << 1;
807861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data |= (start_addr & 7) << 21;
807961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data |= suffix_byte << 24;
808061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
808161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
808261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
808361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
808461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
808561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
808661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_demux_data += 16;
808761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
808861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_type_parse == CODEC_TYPE_VC1) {
808961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("VC1 terminator entry");
809061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0;
809161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0x82 << 24;
809261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
809361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 4, 0, sizeof(OMX_U32));
809461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
809561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
809661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_demux_data += 16;
809761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_demux_entries++;
809861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
809961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //Add zero word to indicate end of descriptors
810061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(p_demux_data, 0, sizeof(OMX_U32));
810161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
810261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
810361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
810461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
810561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
810661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
810761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Demux table complete!");
810861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
8109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
81116eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::createDivxDrmContext()
8112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
811361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE err = OMX_ErrorNone;
811461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    iDivXDrmDecrypt = DivXDrmDecrypt::Create();
811561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (iDivXDrmDecrypt) {
811661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
811761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (err!=OMX_ErrorNone) {
81188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR :iDivXDrmDecrypt->Init %d", err);
8119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            delete iDivXDrmDecrypt;
8120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            iDivXDrmDecrypt = NULL;
812161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
812261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
81238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Unable to Create DIVX DRM");
812461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        err = OMX_ErrorUndefined;
812561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
812661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return err;
8127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
81286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
81296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
81306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
813161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enabled = false;
813261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = NULL;
813361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    init_members();
813461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ColorFormat = OMX_COLOR_FormatMax;
81356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
81376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
81386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
813961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = reinterpret_cast<omx_vdec*>(client);
81406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
814261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::allocate_color_convert_buf::init_members()
814361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
814461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocated_count = 0;
814561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_size_req = 0;
814661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_alignment_req = 0;
814761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_platform_list_client,0,sizeof(m_platform_list_client));
814861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
814961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
815061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
81516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
815261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
81536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
815461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (int i = 0; i < MAX_COUNT; i++)
815561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd[i] = -1;
81566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
815861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
815961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
816061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    c2d.destroy();
81616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
81636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::update_buffer_req()
81646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
816561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
816661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int src_size = 0, destination_size = 0;
816761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_COLOR_FORMATTYPE drv_color_format;
816861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
81698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid client in color convert");
817061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
817161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
817261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
81738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("No color conversion required");
817461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return status;
817561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
817661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
817761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
817861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ColorFormat != OMX_COLOR_FormatYUV420Planar) {
81798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion");
818061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = false;
818161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        goto fail_update_buf_req;
818261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
818361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    c2d.close();
818461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
818561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->drv_ctx.video_resolution.frame_width,
818661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            NV12_128m,YCbCr420P);
818761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
818861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = c2d.get_buffer_size(C2D_INPUT,src_size);
818961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (status)
819061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
819161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
819261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
819361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
819461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                !destination_size) {
81958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d"
819661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "driver size %d destination size %d",
819761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
819861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
819961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            c2d.close();
820061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req = 0;
820161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
820261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req = destination_size;
820361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
820461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
820561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
820661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
820761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
82086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
82096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_update_buf_req:
821061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
821161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
82126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
82146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::set_color_format(
821561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_COLOR_FORMATTYPE dest_color_format)
82166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
821761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
821861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_COLOR_FORMATTYPE drv_color_format;
821961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
82208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid client in color convert");
822161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
822261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
822361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
822461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
822561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_color_format = (OMX_COLOR_FORMATTYPE)
822661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
822761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
82288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Incorrect color format");
82296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        status = false;
82306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
823161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status && (drv_color_format != dest_color_format)) {
82328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Enabling C2D");
823361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
82348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Unsupported color format for c2d");
823561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
823661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
823761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ColorFormat = OMX_COLOR_FormatYUV420Planar;
823861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (enabled)
823961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                c2d.destroy();
824061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            enabled = false;
824161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!c2d.init()) {
82428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("open failed for c2d");
824361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
824461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else
824561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                enabled = true;
824661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
824761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
824861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (enabled)
824961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            c2d.destroy();
825061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enabled = false;
825161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
825261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
825361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
82546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
82566eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
82576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
825861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
82598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
826061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
826161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
826261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
826361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return omx->m_out_mem_ptr;
826461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return m_out_mem_ptr_client;
82656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
826761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
826861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd)
82696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
827061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
82718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
827261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
827361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
827461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
827561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bufadd;
827661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
827761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned index = 0;
827861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufadd - omx->m_out_mem_ptr;
827961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < omx->drv_ctx.op_buf.actualcount) {
828061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
828161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
828261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool status;
828361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
828461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pthread_mutex_lock(&omx->c_lock);
828561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
828661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer,pmem_fd[index],
828761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_baseaddress[index], pmem_baseaddress[index]);
828861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pthread_mutex_unlock(&omx->c_lock);
828961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
829061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!status) {
82918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed color conversion %d", status);
829261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr_client[index].nFilledLen = 0;
829361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return &m_out_mem_ptr_client[index];
829461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
829561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
829661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_mem_ptr_client[index].nFilledLen = 0;
82976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        return &m_out_mem_ptr_client[index];
829861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
82998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr");
830061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
83016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
83026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
830361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
830461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd)
83056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
830661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
83078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
830861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
830961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
831061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
831161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bufadd;
831261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned index = 0;
831361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufadd - m_out_mem_ptr_client;
831461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < omx->drv_ctx.op_buf.actualcount) {
831561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return &omx->m_out_mem_ptr[index];
831661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
83178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr");
83186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return NULL;
83196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
832061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool omx_vdec::allocate_color_convert_buf::get_buffer_req
832161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(unsigned int &buffer_size)
83226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
832361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
832461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
832561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
832661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_size = omx->drv_ctx.op_buf.buffer_size;
832761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
832861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
83298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Get buffer size failed");
833061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
833161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            goto fail_get_buffer_size;
833261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
833361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
833461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
83356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        buffer_size = omx->drv_ctx.op_buf.buffer_size;
833661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
833761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
83386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_get_buffer_size:
833961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
834061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
83416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
83426eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
834361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *bufhdr)
834461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
834561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
834661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
834761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
834861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return omx->free_output_buffer(bufhdr);
834961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enabled && omx->is_component_secure())
835061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
835161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!allocated_count || !bufhdr) {
83528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr);
835361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
835461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
835561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufhdr - m_out_mem_ptr_client;
835661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index >= omx->drv_ctx.op_buf.actualcount) {
83578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer");
835861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
835961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
836061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_fd[index] > 0) {
836161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        munmap(pmem_baseaddress[index], buffer_size_req);
836261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(pmem_fd[index]);
836361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
836461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd[index] = -1;
83656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
836661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx->free_ion_memory(&op_buf_ion_info[index]);
8367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
836861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr[index].video_heap_ptr = NULL;
836961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocated_count > 0)
837061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocated_count--;
837161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
837261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocated_count = 0;
837361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!allocated_count) {
837461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&omx->c_lock);
837561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        c2d.close();
837661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        init_members();
837761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&omx->c_lock);
837861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
837961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
83806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
8381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
83826eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
838361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
83846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
838561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
838661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
838761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
838861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
838961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
839061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enabled && omx->is_component_secure()) {
83918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d",
839261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->is_component_secure());
839361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorUnsupportedSetting;
839461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
839561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!bufferHdr || bytes > buffer_size_req) {
83968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr);
83978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("color_convert buffer_size_req %d bytes %lu",
839861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_size_req,bytes);
839961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
840061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
840161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
84028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert");
840361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
840461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
840561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
840661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
840761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            port,appData,omx->drv_ctx.op_buf.buffer_size);
840861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
84098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Buffer allocation failed color_convert");
841061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
841161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
841261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
841361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->drv_ctx.op_buf.actualcount) {
84148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid header index %d",
841561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (temp_bufferHdr - omx->m_out_mem_ptr));
841661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorUndefined;
841761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
841861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int i = allocated_count;
84196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
842061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
842161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req,buffer_alignment_req,
842261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
842361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            0);
842461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
842561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (op_buf_ion_info[i].ion_device_fd < 0) {
84268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert");
842761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
842861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
842961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
843061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
843161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
843261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_baseaddress[i] == MAP_FAILED) {
84338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req);
843461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(pmem_fd[i]);
843561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        omx->free_ion_memory(&op_buf_ion_info[i]);
843661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
843761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
843861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr[i].video_heap_ptr = new VideoHeap (
843961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            op_buf_ion_info[i].ion_device_fd,buffer_size_req,
844061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
84416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
844261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
844361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info_client[i].offset = 0;
844461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
844561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
844661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list_client[i].nEntries = 1;
844761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
844861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
844961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
845061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nFilledLen = 0;
845161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nFlags = 0;
845261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
845361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
845461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
845561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
845661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
845761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pAppPrivate = appData;
845861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *bufferHdr = &m_out_mem_ptr_client[i];
84598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("IL client buffer header %p", *bufferHdr);
846061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocated_count++;
846161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
84626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
84636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
84646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::is_component_secure()
84656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
846661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return secure_mode;
84676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
84686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
84696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
84706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
847161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
847261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
847361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
847461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dest_color_format =  (OMX_COLOR_FORMATTYPE)
847561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
847661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
847761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
847861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
847961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
848061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
848161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
848261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dest_color_format = OMX_COLOR_FormatYUV420Planar;
848361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
848461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
84856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
8486