1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
26eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalCopyright (c) 2013, 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
94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30
95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_INPUT_ERROR DEFAULT_FPS
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE        0xC5000000
99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE_MASK   0xFF000000
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_AP_SEQ_START_CODE       0x0F010000
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_PROFILE_MASK   0xF0
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE          0
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_MAIN_PROFILE            1
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_ADVANCE_PROFILE         3
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_MED_LEVEL  2
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_LEN            4
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_POS            8
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_A_POS            12
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_POS            24
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SEQ_LAYER_SIZE          36
1136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define POLL_TIMEOUT 0x7fffffff
114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/ion"
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
11961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanextern "C" {
12061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include<utils/Log.h>
12161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif//_ANDROID_
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_4K 0x1000
1256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_1M 0x100000
1266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
1296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define EXTRADATA_IDX(__num_planes) (__num_planes  - 1)
130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA)
132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input)
133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
13461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer;
13561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
13661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pollfd pfd;
13761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer v4l2_buf;
13861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
13961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event dqevent;
14061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pfd.fd = omx->drv_ctx.video_driver_fd;
14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: Async thread start\n");
14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (1) {
14761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = poll(&pfd, 1, POLL_TIMEOUT);
14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc) {
14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Poll timedout\n");
15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
15161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (rc < 0) {
15261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Error while polling: %d\n", rc);
15361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_msginfo vdec_msg;
15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.length = omx->drv_ctx.num_planes;
16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.m.planes = plane;
16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (uint64_t)v4l2_buf.timestamp.tv_usec;
16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (vdec_msg.msgdata.output_frame.len) {
17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
17961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_msginfo vdec_msg;
18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.length = 1;
18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.m.planes = plane;
18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pfd.revents & POLLPRI) {
19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
19961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
20161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
20261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
20361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\n VIDC Port Reconfig recieved \n");
20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
20661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
20861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT ) {
20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
21061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_INFO_CONFIG_CHANGED;
21161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
21261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\n VIDC Port Reconfig recieved \n");
21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
21461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
21561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
21761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
21961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
22161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\n VIDC Flush Done Recieved \n");
22261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
22361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
22461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
22661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
22761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
22861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\n VIDC Flush Done Recieved \n");
22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
23061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
23161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
23261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
23361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
23461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\n VIDC Close Done Recieved and async_message_thread Exited \n");
23561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
23661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
23761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
23861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR;
23961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
24061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\n SYS Error Recieved \n");
24161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
24261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n async_message_thread Exited  \n");
24361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
24561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
24661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\n VIDC Some Event recieved \n");
24761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                continue;
24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
24961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
25161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop\n");
25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input)
256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
25761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
25861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char id;
25961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int n;
26061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx == NULL) {
26161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("message thread null pointer rxd\n");
26261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
26361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
26561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: message thread start\n");
26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
26761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (1) {
268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
26961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        n = read(omx->m_pipe_in, &id, 1);
270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
27161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (0 == n) {
27261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
27361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
27561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (1 == n) {
27661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->process_event_cb(omx, id);
27761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
27861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((n < 0) && (errno != EINTR)) {
27961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\nERROR: read from pipe failed, ret %d errno %d", n, errno);
28061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
28161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
28361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: message thread stop\n");
28461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id)
288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
28961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret_value;
2906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
29161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx == NULL) {
29261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("message thread null pointer rxd\n");
29361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
29461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
29561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d\n", id,omx->m_pipe_out);
29661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret_value = write(omx->m_pipe_out, &id, 1);
29761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("post_message to pipe done %d\n",ret_value);
298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor
301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue()
302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
30361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Nothing to do
304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor
307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    memset(m_q,0,sizeof(m_q));
310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert
313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
31561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
31661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
31761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].id       = id;
31861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].param1   = p1;
31961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].param2   = p2;
32061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_write++;
32161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_size ++;
32261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
32361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_write = 0;
32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full\n", __func__);
32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop
333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
33661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_size > 0) {
33761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *id = m_q[m_read].id;
33861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *p1 = m_q[m_read].param1;
33961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *p2 = m_q[m_read].param2;
34061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Move the read pointer ahead
34161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ++m_read;
34261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        --m_size;
34361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_read = 0;
34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
34961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue
353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return m_q[m_read].id;
356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list()
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
36161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //initialize timestamps array
36261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_ts_arr_list, 0, sizeof(m_ts_arr_list) );
363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list()
365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
36661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //free m_ts_arr_list?
367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
37161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
37261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool duplicate_ts = false;
37361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
37461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
37561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //insert at the first available empty location
37661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
37761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_ts_arr_list[idx].valid) {
37861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //found invalid or empty entry, save timestamp
37961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_ts_arr_list[idx].valid = true;
38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_ts_arr_list[idx].timestamp = ts;
38161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ts, idx);
38361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
39161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
39661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
39761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int min_idx = -1;
39861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_TICKS min_ts = 0;
39961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
40061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
40161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
40261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
40361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_ts_arr_list[idx].valid) {
40461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //found valid entry, save index
40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (min_idx < 0) {
40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //first valid entry
40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_ts = m_ts_arr_list[idx].timestamp;
40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_idx = idx;
40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (m_ts_arr_list[idx].timestamp < min_ts) {
41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_ts = m_ts_arr_list[idx].timestamp;
41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_idx = idx;
41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (min_idx < 0) {
41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //no valid entries found
41961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ts = 0;
42161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
42261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
42361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ts = m_ts_arr_list[min_idx].timestamp;
42461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ts_arr_list[min_idx].valid = false;
42561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ts, min_idx);
42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list()
435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
43661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
43761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
43861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
43961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
44061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
44161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ts_arr_list[idx].valid = false;
44261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
44361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances
448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void)
449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
45061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return (new omx_vdec);
451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
45661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct ion_handle *handle, int ionMapfd)
457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
45861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base)
462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // dup file descriptor, map once, use pmem
464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    init(dup(fd), base, size, 0 , MEM_DEVICE);
465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_
468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
46961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
47061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::omx_vdec
471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
47261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
47361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Constructor
474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
47561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None
477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
48061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::omx_vdec(): m_error_propogated(false),
48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_state(OMX_StateInvalid),
48361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_app_data(NULL),
48461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_mem_ptr(NULL),
48561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr(NULL),
48661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_err_count(0),
48761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_flush_progress (false),
48861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_flush_progress (false),
48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_use_buffer (false),
49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_use_buffer (false),
49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers(false),
49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_use_output_pmem(OMX_FALSE),
49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_region_smi(OMX_FALSE),
49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_pvt_entry_pmem(OMX_FALSE),
49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_input_buffers(0),
49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers(0),
49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bm_count(0),
49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bm_count(0),
49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bPopulated(OMX_FALSE),
50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bPopulated(OMX_FALSE),
50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_flags(0),
502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr(NULL),
504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bEnabled(OMX_TRUE),
50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bEnabled(OMX_TRUE),
50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_in_alloc_cnt(0),
50861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list(NULL),
50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry(NULL),
51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info(NULL),
51161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    arbitrary_bytes (true),
51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    psource_frame (NULL),
51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pdest_frame (NULL),
51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_heap_ptr (NULL),
51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_phdr_pmem_ptr(NULL),
51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_inp_bm_count (0),
51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    codec_type_parse ((codec_type)0),
51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame_meta (true),
51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_count (0),
52061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nal_count (0),
52161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nal_length(0),
52261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    look_ahead_nal (false),
52361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame(0),
52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_buffer(NULL),
52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame_size (0),
52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_device_file_ptr(NULL),
52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_vc1_profile((vc1_profile_type)0),
52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_last_au_ts(LLONG_MAX),
52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_last_au_flags(0),
53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prev_ts(LLONG_MAX),
53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rst_prev_ts(true),
53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frm_int(0),
53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    in_reconfig(false),
53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_display_id(NULL),
53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_parser(NULL),
53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    client_extradata(0),
537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_enable_android_native_buffers(OMX_FALSE),
53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_use_android_native_buffers(OMX_FALSE),
54061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    iDivXDrmDecrypt(NULL),
541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_desc_buffer_ptr(NULL),
54361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    secure_mode(false)
544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Assumption is that , to begin with , we have all the frames with decoder */
54661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
54861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char property_value[PROPERTY_VALUE_MAX] = {0};
54961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.perf", property_value, "0");
55061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    perf_flag = atoi(property_value);
55161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
55261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
55361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dec_time.start();
55461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        proc_frms = latency = 0;
55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
55661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_value[0] = '\0';
55761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.ts", property_value, "0");
55861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_timestamp = atoi(property_value);
55961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
56061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
56161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.set_timestamp_reorder_mode(true);
56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.enable_debug_print(true);
56361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
56461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
56561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_value[0] = '\0';
56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.concealedmb", property_value, "0");
56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_concealedmb = atoi(property_value);
56861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
57161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_cmp,0,sizeof(m_cmp));
57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_cb,0,sizeof(m_cb));
57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&drv_ctx,0,sizeof(drv_ctx));
57461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
57561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
57661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_demux_offsets, 0, sizeof(m_demux_offsets) );
57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
5786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_
57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
5806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
58161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
58261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.timestamp_adjust = false;
58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.video_driver_fd = -1;
58461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_vendor_config.pData = NULL;
58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&m_lock, NULL);
58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&c_lock, NULL);
58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    sem_init(&m_cmd_lock,0,0);
58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    streaming[CAPTURE_PORT] =
58961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        streaming[OUTPUT_PORT] = false;
590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
59161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char extradata_value[PROPERTY_VALUE_MAX] = {0};
59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.extradata", extradata_value, "0");
59361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_extradata = atoi(extradata_value);
59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
59661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    client_buffers.set_vdec_client(this);
5986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
5996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
6006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic const int event_type[] = {
60161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
60561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_SYS_ERROR
6066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal};
6076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
6086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE subscribe_to_events(int fd)
6096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
61061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
61161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
61261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
61361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
61461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Invalid input: %d\n", fd);
61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
61761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
61961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
62061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
62161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
62261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            printf("Failed to subscribe event: 0x%x\n", sub.type);
62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
62861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < array_sz) {
62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (--i; i >=0 ; i--) {
63061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(&sub, 0, sizeof(sub));
63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sub.type = event_type[i];
63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc)
63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                printf("Failed to unsubscribe event: 0x%x\n", sub.type);
63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorNotImplemented;
63761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE unsubscribe_to_events(int fd)
6436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
64461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
64561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
64661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
64761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
64861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
64961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Invalid input: %d\n", fd);
65061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
65161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
65261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
65361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
65461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
65561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
65661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            printf("Failed to unsubscribe event: 0x%x\n", sub.type);
65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
66061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
6636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
6646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
66661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::~omx_vdec
668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
66961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
67061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Destructor
671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None
674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
67661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
67761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec()
679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
68061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info = NULL;
68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_decoder_cmd dec;
68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("In OMX vdec Destructor");
68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_pipe_in) close(m_pipe_in);
68461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_pipe_out) close(m_pipe_out);
68561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pipe_in = -1;
68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pipe_out = -1;
68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_join(msg_thread_id,NULL);
68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dec.cmd = V4L2_DEC_CMD_STOP;
69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n STOP Command failed\n");
69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_join(async_thread_id,NULL);
69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsubscribe_to_events(drv_ctx.video_driver_fd);
69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    close(drv_ctx.video_driver_fd);
69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_destroy(&m_lock);
69861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_destroy(&c_lock);
69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    sem_destroy(&m_cmd_lock);
70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dec_time.end();
70361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
71161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
71261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
71361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.count = 0;
71461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
71561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
71661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
71761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
7186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
7196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::OMXCntrlProcessMsgCb
723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
72461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
72561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL Client callbacks are generated through this routine. The decoder
72661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   provides the thread context for this routine.
727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
72961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ctxt -- Context information related to the self.
73061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   id   -- Event identifier. This could be any of the following:
73161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   1. Command completion event
73261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   2. Buffer done callback event
73361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   3. Frame done callback event
734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
73661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    signed int p1; // Parameter - 1
74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    signed int p2; // Parameter - 2
74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int ident;
74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int qsize=0; // qsize
74561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec *pThis = (omx_vdec *) ctxt;
74661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!pThis) {
74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out\n",
74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__);
75061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
75361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Protect the shared queue data structure
75461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    do {
75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Read the message id's from the queue*/
75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&pThis->m_lock);
75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qsize = pThis->m_cmd_q.m_size;
75861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize) {
75961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
76261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
76361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize = pThis->m_ftb_q.m_size;
76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (qsize) {
76561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
76761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize = pThis->m_etb_q.m_size;
77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (qsize) {
77261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&pThis->m_lock);
77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
77761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*process message if we have one*/
77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize > 0) {
77961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id = ident;
78061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch (id) {
78161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT:
78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        switch (p1) {
78461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandStateSet:
78561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = (OMX_STATETYPE) p2;
78661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_HIGH("\n OMX_CommandStateSet complete, m_state = %d",
78761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->m_state);
78861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL);
79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
79161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
79261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_EventError:
79361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (p2 == OMX_StateInvalid) {
79461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    DEBUG_PRINT_ERROR("\n OMX_EventError: p2 is OMX_StateInvalid");
79561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_state = (OMX_STATETYPE) p2;
79661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
79761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
79861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else if (p2 == OMX_ErrorHardware) {
79961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->omx_report_error();
80061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else {
80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
80261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventError, p2, (OMX_U32)NULL, NULL );
80361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
80461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
80561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandPortDisable:
80761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_HIGH("\n OMX_CommandPortDisable complete for port [%d]", p2);
80861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
80961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    break;
81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
81361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig) {
81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    OMX_ERRORTYPE eRet = OMX_ErrorNone;
81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_HIGH("Failed to release output buffers\n");
81861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
81961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->in_reconfig = false;
82061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (eRet !=  OMX_ErrorNone) {
82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error();
82361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
82861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandPortEnable:
83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_HIGH("\n OMX_CommandPortEnable complete for port [%d]", p2);
83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            default:
83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL\n", __func__);
84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_ETB:
85361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
85461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
85561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_FTB:
86161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure");
86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_COMMAND:
86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (OMX_U32)p2,(OMX_PTR)NULL);
87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EBD:
87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
87661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EBD failure");
87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_inp_err_count++;
88161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->time_stamp_dts.remove_time_stamp(
88261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ?true:false);
88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_inp_err_count = 0;
88761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ( pThis->empty_buffer_done(&pThis->m_cmp,
88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\n empty_buffer_done failure");
89161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_inp_err_count >= MAX_INPUT_ERROR) {
89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\n Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
89661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
90061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    {
90161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        int64_t *timestamp = (int64_t *)p1;
90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p1) {
90361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->time_stamp_dts.remove_time_stamp(*timestamp,
90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
90561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ?true:false);
90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            free(timestamp);
90761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_FBD:
91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 != VDEC_S_SUCCESS) {
91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_FBD failure");
91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
91561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n fill_buffer_done failure");
91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n Driver flush i/p Port complete");
92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!pThis->input_flush_progress) {
92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
92561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->execute_input_flush();
92761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
92861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (p2 != VDEC_S_SUCCESS) {
92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_ERROR("\nOMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->omx_report_error ();
93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else {
93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                /*Check if we need generate event for Flush done*/
93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
93561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    DEBUG_PRINT_LOW("\n Input Flush completed - Notify Client");
93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventCmdComplete,OMX_CommandFlush,
93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_CORE_INPUT_PORT_INDEX,NULL );
94061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
94261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_IDLE_PENDING)) {
94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_ERROR("\n Failed to call streamoff on OUTPUT Port \n");
94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error ();
94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    } else {
94761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->streaming[OUTPUT_PORT] = false;
94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
94961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (!pThis->output_flush_progress) {
95061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_LOW("\n Input flush done hence issue stop");
95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_GENERATE_STOP_DONE);
95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
95561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
95661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
95761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
96161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
96361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n Driver flush o/p Port complete");
96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!pThis->output_flush_progress) {
96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_HIGH("\n WARNING: Unexpected flush from driver");
96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->execute_output_flush();
96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
96961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (p2 != VDEC_S_SUCCESS) {
97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
97161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->omx_report_error ();
97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else {
97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                /*Check if we need generate event for Flush done*/
97461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
97661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    DEBUG_PRINT_LOW("\n Notify Output Flush done");
97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
97861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventCmdComplete,OMX_CommandFlush,
98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_CORE_OUTPUT_PORT_INDEX,NULL );
98161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
98261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
98361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    DEBUG_PRINT_LOW("\n Internal flush complete");
98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,
98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
98761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (BITMASK_PRESENT(&pThis->m_flags,
98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
98961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->post_event(OMX_CommandPortDisable,
99061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_CORE_OUTPUT_PORT_INDEX,
99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_GENERATE_EVENT);
99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        BITMASK_CLEAR (&pThis->m_flags,
99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
99561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
99761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_ERROR("\n Failed to call streamoff on CAPTURE Port \n");
100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error ();
100261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
100361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->streaming[CAPTURE_PORT] = false;
100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (!pThis->input_flush_progress) {
100661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_LOW("\n Output flush done hence issue stop");
100761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_GENERATE_STOP_DONE);
100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
101161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
101261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
101361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
101461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
101761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_START_DONE:
101961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_START_DONE");
102061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_START_DONE Failure");
102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_START_DONE Success");
102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_LOW("\n Move to executing");
102961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                // Send the callback now
103061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StateExecuting;
103261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
103461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StateExecuting, NULL);
103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else if (BITMASK_PRESENT(&pThis->m_flags,
103661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_COMPONENT_PAUSE_PENDING)) {
103761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (/*ioctl (pThis->drv_ctx.video_driver_fd,
103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) {
103961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_PAUSE failed");
104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->omx_report_error ();
104161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
104561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("\n Event Handler callback is NULL");
104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_PAUSE_DONE:
105061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
105161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
105261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
105661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->complete_pending_buffer_done_cbs();
105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
105861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
105961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                //Send the callback now
106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
106161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StatePause;
106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
106361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StatePause, NULL);
106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
106961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
107061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
107161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_RESUME_DONE:
107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
107761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_RESUME_DONE failed");
107861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
108061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
108161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_LOW("\n Moving the decoder to execute state");
108261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                // Send the callback now
108361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StateExecuting;
108561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
108761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StateExecuting,NULL);
108861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_STOP_DONE:
109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
110361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->complete_pending_buffer_done_cbs();
110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_LOW("\n OMX_COMPONENT_GENERATE_STOP_DONE Success");
110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                // Send the callback now
110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StateIdle;
110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_LOW("\n Move to Idle State");
111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
111161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StateIdle,NULL);
111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 == OMX_IndexParamPortDefinition) {
112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->in_reconfig = true;
112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_EventPortSettingsChanged, p1, p2, NULL );
113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
113361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) {
113561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
113761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            format = OMX_InterlaceInterleaveFrameTopFieldFirst;
113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        else //unsupported interlace format; raise a error
114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            event = OMX_EventError;
114361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
114461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
114561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    event, format, 0, NULL );
114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EOS_DONE:
115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
115961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->prev_ts = LLONG_MAX;
116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->rst_prev_ts = true;
116261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
116361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
116461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
116561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\n OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
116661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->omx_report_error ();
116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    {
117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_HIGH("\n Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
117161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
117261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
117461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
117561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
117661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
117761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
117861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
117961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
118061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
118261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&pThis->m_lock);
118361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qsize = pThis->m_cmd_q.m_size;
118461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pThis->m_state != OMX_StatePause)
118561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
118661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&pThis->m_lock);
118761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } while (qsize>0);
1188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::update_resolution(int width, int height)
11926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
11936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.frame_height = height;
11946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.frame_width = width;
11956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.scan_lines = height;
11966eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.stride = width;
11976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nLeft = 0;
11986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nTop = 0;
11996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nWidth = drv_ctx.video_resolution.frame_width;
12006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nHeight = drv_ctx.video_resolution.frame_height;
12016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
1202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
120461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
120561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentInit
1206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
120761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
120861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Initialize the component.
1209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
121061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
121161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ctxt -- Context information related to the self.
121261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   id   -- Event identifier. This could be any of the following:
121361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   1. Command completion event
121461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   2. Buffer done callback event
121561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   3. Frame done callback event
1216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
121761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
121861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
122061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
1222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
122561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_fmtdesc fdesc;
122661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
122761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
122861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
122961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int   alignment = 0,buffer_size = 0;
123061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fds[2];
123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int r,ret=0;
123261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool codec_ambiguous = false;
123361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_STRING device_name = (OMX_STRING)"/dev/video/q6_dec";
123461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.video_driver_fd = open(device_name, O_RDWR);
123561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
123661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\n omx_vdec::component_init(): Open device %s returned fd %d, errno %d",
123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            device_name, drv_ctx.video_driver_fd, errno);
123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
123961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.video_driver_fd == 0) {
124061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.video_driver_fd = open(device_name, O_RDWR);
124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
124361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.video_driver_fd < 0) {
124461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d\n", errno);
124561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
124661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
124761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
124861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.frame_rate.fps_denominator = 1;
1249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
12506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    ret = pthread_create(&async_thread_id,0,async_message_thread,this);
125161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret < 0) {
125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(drv_ctx.video_driver_fd);
125361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Failed to create async_message_thread \n");
125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
125861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
1259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
126161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    outputBufferFile1 = fopen (outputfilename, "ab");
1262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
126461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    outputExtradataFile = fopen (ouputextradatafilename, "ab");
1265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
126761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Copy the role information which provides the decoder kind
126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    strlcpy(drv_ctx.kind,role,128);
126961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
127061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
127161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
127261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
127361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE);
127461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.timestamp_adjust = true;
127561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
127661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingMPEG4;
127761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_MPEG4;
127861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Initialize Start Code for MPEG4*/
127961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_MPEG4;
128061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "m4v");
1283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
128461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE);
128861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_MPEG2;
129061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingMPEG2;
129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Initialize Start Code for MPEG2*/
129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_MPEG2;
129361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
129561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "mpg");
1296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
129761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n H263 Decoder selected");
130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingH263;
130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_H263;
130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_H263;
130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
130761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "263");
1308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW ("\n DIVX 311 Decoder selected");
131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
131461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX_311;
131561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
131861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
131961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = createDivxDrmContext();
132061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet != OMX_ErrorNone) {
132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
132261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return eRet;
132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
132461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
132561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
132661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
132761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR ("\n DIVX 4 Decoder selected");
132861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
132961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX;
133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_ambiguous = true;
133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = createDivxDrmContext();
133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet != OMX_ErrorNone) {
133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return eRet;
133961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR ("\n DIVX 5/6 Decoder selected");
134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX;
134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
134861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_ambiguous = true;
134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = createDivxDrmContext();
135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet != OMX_ErrorNone) {
135361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return eRet;
135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
135761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
135961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_H264;
136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingAVC;
136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_H264;
136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "264");
1368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
136961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\
137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
137161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC;
137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_HEVC;
137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc;
137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_HEVC;
137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
13786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef INPUT_BUFFER_LOG
137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "265");
13806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
138261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingWMV;
138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VC1;
138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "vc1");
1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
139261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
139461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingWMV;
139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VC1;
139861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
139961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "vc1");
1402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
140361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",\
140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
140561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_VP8;
140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingVPX;
140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VP8;
140961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        arbitrary_bytes = false;
141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
141161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:Unknown Component\n");
141261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInvalidComponentName;
141361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
141561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    inputBufferFile1 = fopen (inputfilename, "ab");
1416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
141761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
1418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
14206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
14216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
14226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        if (!client_buffers.set_color_format(dest_color_format)) {
14236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            DEBUG_PRINT_ERROR("\n Setting color format failed");
14246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            eRet = OMX_ErrorInsufficientResources;
14256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
1426dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        capture_capability= V4L2_PIX_FMT_NV12;
142861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = subscribe_to_events(drv_ctx.video_driver_fd);
142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
143061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Subscribe Event Failed \n");
143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
143261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
143361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
143461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_capability cap;
143561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
143661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
143761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to query capabilities\n");
143861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
143961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
144061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    " version = %d, capabilities = %x\n", cap.driver, cap.card,
144261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    cap.bus_info, cap.version, cap.capabilities);
144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
144461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret=0;
144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.index=0;
144761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
144861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
144961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fdesc.pixelformat, fdesc.flags);
145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fdesc.index++;
145161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
145261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
145361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.index=0;
145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
145561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
145761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fdesc.pixelformat, fdesc.flags);
145861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fdesc.index++;
145961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
14606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        update_resolution(320, 240);
146161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
146261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
146361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
146561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
146661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
146861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set format on output port\n");
146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
147061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_ambiguous) {
147261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (output_capability == V4L2_PIX_FMT_DIVX) {
147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control divx_ctrl;
147461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
147761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
147961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
148061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
148161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
148261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
148361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
148461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (ret) {
148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("Failed to set divx version\n");
148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Codec should not be ambiguous");
149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
149461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
149561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
149661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
149761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
150061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set format on capture port\n");
150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Set Format was successful \n ");
150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode) {
150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = 1;
150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d\n", ret);
150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ret) {
150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d\n", ret);
151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(drv_ctx.video_driver_fd);
151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
151261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
151461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Get the Buffer requirements for input and output ports*/
151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
151861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode) {
151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.op_buf.alignment=SZ_1M;
152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf.alignment=SZ_1M;
152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.op_buf.alignment=SZ_4K;
152361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf.alignment=SZ_4K;
152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
152561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata = 0;
152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
152961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
153061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
153161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.idr_only_decoding = 0;
1532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
15336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        m_state = OMX_StateLoaded;
1534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA
15356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        if (eRet == OMX_ErrorNone && !secure_mode)
15366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            enable_extradata(DEFAULT_EXTRADATA, true, true);
1537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
15386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        eRet=get_buffer_req(&drv_ctx.ip_buf);
15396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        DEBUG_PRINT_HIGH("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size);
15406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        get_buffer_req(&drv_ctx.op_buf);
154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC) {
154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
154561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFilledLen = 0;
154661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nOffset = 0;
154761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
154861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.pBuffer == NULL) {
154961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n h264_scratch.pBuffer Allocation failed ");
155061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
155161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
155261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
155361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
155461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_frame_parser.mutils == NULL) {
155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_frame_parser.mutils = new H264_Utils();
155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_frame_parser.mutils == NULL) {
155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\n parser utils Allocation failed ");
156061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorInsufficientResources;
156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_frame_parser.mutils->initialize_frame_checking_environment();
156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
156561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
156661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_parser = new h264_stream_parser();
156861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!h264_parser) {
156961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
157061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
157161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
157261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
157361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
157461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pipe(fds)) {
157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("pipe creation failed\n");
157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
157861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int temp1[2];
157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (fds[0] == 0 || fds[1] == 0) {
158061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pipe (temp1)) {
158161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("pipe creation failed\n");
158261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
15836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                }
158461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //close (fds[0]);
158561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //close (fds[1]);
158661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fds[0] = temp1 [0];
158761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fds[1] = temp1 [1];
158861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
158961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pipe_in = fds[0];
159061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pipe_out = fds[1];
159161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            r = pthread_create(&msg_thread_id,0,message_thread,this);
159261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
159361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (r < 0) {
159461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n component_init(): message_thread creation failed");
159561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
159661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
159761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
15996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
160061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet != OMX_ErrorNone) {
160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Component Init Failed");
160261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
160461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                NULL);
160561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Calling close() on Video Driver");
160661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close (drv_ctx.video_driver_fd);
160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.video_driver_fd = -1;
160861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
160961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n omx_vdec::component_init() success");
161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
161161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
161261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
1613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
161661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
161761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetComponentVersion
1618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
161961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
162061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns the component version.
1621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
162261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
162361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   TBD.
1624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
162561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
162661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX_ErrorNone.
1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
162861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_component_version
163061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(
163161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp,
163261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STRING componentName,
163361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* componentVersion,
163461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* specVersion,
163561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_UUIDTYPE* componentUUID
163661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan )
1637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
163861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
1639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State\n");
1640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
164261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* TBD -- Return the proper version */
164361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (specVersion) {
164461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        specVersion->nVersion = OMX_SPEC_VERSION;
164561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
164661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
1647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
164961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
165061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommand
1651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
165261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
165361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
1654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
165561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
165861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
165961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
1660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
166161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
166361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_COMMANDTYPE cmd,
166461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32 param1,
166561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR cmdData
166661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
1667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n send_command: Recieved a Command from Client");
166961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
1670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State\n");
1671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
1672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
167461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
167561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n send_command(): ERROR OMX_CommandFlush "
167661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "to invalid port: %lu", param1);
167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
1678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
1680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sem_wait(&m_cmd_lock);
1681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n send_command: Command Processed\n");
1682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
1683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
168761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommand
1688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
169061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
1691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
169261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
169361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
169561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
169661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
1697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
169861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
170061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_COMMANDTYPE cmd,
170161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32 param1,
170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR cmdData
170361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
1704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
170561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
170661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int bFlag = 1,sem_posted = 0,ret=0;
170861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n send_command_proxy(): cmd = %d", cmd);
171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\n send_command_proxy(): Current State %d, Expected State %d",
171161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_state, eState);
171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
171361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (cmd == OMX_CommandStateSet) {
171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandStateSet issued");
171561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Current State %d, Expected State %d", m_state, eState);
171661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Loaded */
171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_state == OMX_StateLoaded) {
172061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateIdle) {
172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //if all buffers are allocated or all ports disabled
172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (allocate_done() ||
172361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle\n");
172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending\n");
172761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
172861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // Skip the event notification
172961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
173061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
173161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Loaded */
173361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
173461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded\n");
173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
173861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to WaitForResources */
174061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
174361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources\n");
174461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
174561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Executing */
174661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
174761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing\n");
174861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
174961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
175161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
175261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Pause */
175361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
175461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause\n");
175561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
175961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Invalid */
176061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
176161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid\n");
176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
176561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)\n",\
176661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eState);
176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
177261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is IDLE */
177361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
177461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateIdle) {
177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateLoaded) {
177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (release_done()) {
177761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    /*
177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       Since error is None , we will post an event at the end
177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       of this function definition
178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     */
178161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded\n");
178261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
178361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending\n");
178461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
178561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // Skip the event notification
178661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
178761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
178861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
178961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Executing */
179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
179161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
179261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
179361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
179561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state=OMX_StateExecuting;
179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful\n");
179761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
179861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Idle */
179961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateIdle) {
180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle\n");
180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
180261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
180361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
180461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
180561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to WaitForResources */
180661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
180761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources\n");
180861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
180961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
181061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
181161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
181261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Pause */
181361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
181461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*To pause the Video core we need to start the driver*/
181561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
181661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      NULL) < */0) {
181761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\n VDEC_IOCTL_CMD_START FAILED");
181861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
181961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorHardware;
182061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
182161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
182261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause\n");
182361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
182461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
182561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
182661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Invalid */
182761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
182861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid\n");
182961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
183061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
183161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
183261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled\n",eState);
183361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
183461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1835dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
1836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
183761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /******************************/
183861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Executing */
183961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /******************************/
184061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateExecuting) {
184161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Command Recieved in OMX_StateExecuting");
184261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Idle */
184361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateIdle) {
184461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
184561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition
184661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 */
184761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n");
184861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
184961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!sem_posted) {
185061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_posted = 1;
185161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_post (&m_cmd_lock);
185261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_ALL);
185361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
185461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
185561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Paused */
185761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
185861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n PAUSE Command Issued");
185961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state = OMX_StatePause;
186061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
186161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
186261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Loaded */
186361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
186461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Loaded \n");
186561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
186661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
186761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
186861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
186961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to WaitForResources */
187061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
187161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> WaitForResources \n");
187261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
187361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
187461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
187561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
187661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Executing */
187761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
187861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Executing \n");
187961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
188061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
188161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
188261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
188361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Invalid */
188461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
188561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n send_command_proxy(): Executing --> Invalid \n");
188661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
188761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
188861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
188961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled\n",eState);
189061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
189161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
189261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
189361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
189461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Pause  */
189561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
189661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StatePause) {
189761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Executing */
189861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateExecuting) {
189961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Pause --> Executing \n");
190061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state = OMX_StateExecuting;
190161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
190261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
190361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Idle */
190461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateIdle) {
190561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
190661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
190761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Pause --> Idle \n");
190861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
190961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!sem_posted) {
191061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_posted = 1;
191161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_post (&m_cmd_lock);
191261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_ALL);
191361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
191461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
191561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
191661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to loaded */
191761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
191861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n Pause --> loaded \n");
191961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
192061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
192161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
192261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
192361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to WaitForResources */
192461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
192561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n Pause --> WaitForResources \n");
192661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
192761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
192861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
192961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
193061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Pause */
193161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
193261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n Pause --> Pause \n");
193361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
193461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
193561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
193661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
193761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Invalid */
193861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
193961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n Pause --> Invalid \n");
194061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
194161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
194261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
194361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled\n",eState);
194461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
194561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
194661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
194761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
194861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is WaitForResources  */
194961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
195061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateWaitForResources) {
195161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Loaded */
195261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateLoaded) {
195361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
195461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
195561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded\n");
195661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
195761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to WaitForResources */
195861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
195961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources\n");
196061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,
196161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
196261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
196361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
196461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Executing */
196561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
196661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing\n");
196761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
196861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
196961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
197061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
197161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Pause */
197261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
197361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause\n");
197461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
197561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
197661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
197761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
197861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Invalid */
197961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
198061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid\n");
198161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
198261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
198361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
198461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Loaded -
198561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan               is NOT tested by Khronos TS */
198661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
198761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
198861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)\n",m_state,eState);
198961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
199261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /********************************/
199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Current State is Invalid */
199461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*******************************/
199561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (m_state == OMX_StateInvalid) {
199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* State Transition from Inavlid to any state */
199761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || OMX_StateIdle || OMX_StateExecuting
199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || OMX_StatePause || OMX_StateInvalid)) {
200061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded\n");
200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_EventError,OMX_ErrorInvalidState,\
200261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
200361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInvalidState;
2004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
200561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (cmd == OMX_CommandFlush) {
200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandFlush issued"
200761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "with param1: %lu", param1);
200861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
200961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
201261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
201361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
201461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!sem_posted) {
201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sem_posted = 1;
201661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Set the Semaphore");
201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sem_post (&m_cmd_lock);
201861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            execute_omx_flush(param1);
201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
202061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bFlag = 0;
202161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ( cmd == OMX_CommandPortEnable) {
202261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortEnable issued"
202361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "with param1: %lu", param1);
202461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
202561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bEnabled = OMX_TRUE;
202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( (m_state == OMX_StateLoaded &&
202861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || allocate_input_done()) {
203061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
203161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
203261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
203461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
203561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
203661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
203761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
203861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
203961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
204061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Enable output Port command recieved");
204161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bEnabled = OMX_TRUE;
204261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
204361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( (m_state == OMX_StateLoaded &&
204461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
204561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || (allocate_output_done())) {
204661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
2047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
2048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
204961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
205061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending\n");
205161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
205261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
205361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
205461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
205561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
205661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (cmd == OMX_CommandPortDisable) {
205761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n send_command_proxy(): OMX_CommandPortDisable issued"
205861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "with param1: %lu", param1);
205961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
206061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bEnabled = OMX_FALSE;
206161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
206261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    && release_input_done()) {
206361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
2064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
206561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
206661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
206761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
206861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!sem_posted) {
206961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_posted = 1;
207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_post (&m_cmd_lock);
207161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
207261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
207361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
207461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
207561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
207661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
207761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
207861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
207961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
208061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bEnabled = OMX_FALSE;
208161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Disable output Port command recieved");
208261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
208361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    && release_output_done()) {
208461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
2085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
208661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
208761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
208861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
208961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!sem_posted) {
209061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_posted = 1;
209161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_post (&m_cmd_lock);
209261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
209361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
209461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
209561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
209661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
209761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
209861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
209961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
210061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
210161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)\n",cmd);
210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorNotImplemented;
210461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
210561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone && bFlag) {
210661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!sem_posted) {
210961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sem_post(&m_cmd_lock);
211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
211261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
211661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
211761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ExecuteOmxFlush
2118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
212061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Executes the OMX flush.
2121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   flushtype - input flush(1)/output flush(0)/ both.
2124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
212561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
212661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
2127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
212861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType)
2130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
213161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
213261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane;
213361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer v4l2_buf;
213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_decoder_cmd dec;
213561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("in %s", __func__);
213661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
213861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (flushType) {
213961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_CORE_INPUT_PORT_INDEX:
214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input_flush_progress = true;
214161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT;
214261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
214361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_CORE_OUTPUT_PORT_INDEX:
214461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            output_flush_progress = true;
214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
214661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
214761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input_flush_progress = true;
214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            output_flush_progress = true;
215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT |
215161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
215261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
215361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
215461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
215561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Flush Port (%lu) Failed ", flushType);
215661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = false;
215761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
215861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
215961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
2162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush
2163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
216561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at OUTPUT PORT.
2166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
216861a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone.
2169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false
2172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
2173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush()
2174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
217561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p1 = 0; // Parameter - 1
217661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p2 = 0; // Parameter - 2
217761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      ident = 0;
217861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = true;
217961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
218061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Generate FBD for all Buffers in the FTBq*/
218161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
218261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Initiate Output Flush");
218361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_ftb_q.m_size) {
218461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Buffer queue size %d pending buf cnt %d",
218561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_ftb_q.m_size,pending_output_buffers);
218661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.pop_entry(&p1,&p2,&ident);
218761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n ID(%x) P1(%x) P2(%x)", ident, p1, p2);
218861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == m_fill_output_msg ) {
218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
219161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
219261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
219461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
219561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_flush_progress = false;
219661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
219761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
219861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = LLONG_MAX;
219961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
220061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
220161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\n OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
220261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
2205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush
2206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
220861a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at INPUT PORT.
2209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
221161a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone.
2212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
221461a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false
2215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
2216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush()
2217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
221861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned       i =0;
221961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p1 = 0; // Parameter - 1
222061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p2 = 0; // Parameter - 2
222161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      ident = 0;
222261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = true;
222361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
222461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Generate EBD for all Buffers in the ETBq*/
222561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Initiate Input Flush \n");
222661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
222761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
222861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Check if the Queue is empty \n");
222961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_etb_q.m_size) {
223061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.pop_entry(&p1,&p2,&ident);
223161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
223261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_input_buffers++;
223761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
223961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
224061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
224261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p1);
224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
224561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    time_stamp_dts.flush_timestamp();
224761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Check if Heap Buffers are to be flushed*/
224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
224961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Reset all the variables before flusing");
225061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_scratch.nFilledLen = 0;
225161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_count = 0;
225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
225361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_count = 0;
225461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_ts = LLONG_MAX;
225561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_flags = 0;
225661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
225761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_entries = 0;
225861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Initialize parser");
225961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils) {
226061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils->initialize_frame_checking_environment();
226161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
226261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
226361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (m_input_pending_q.m_size) {
226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&p1,&p2,&ident);
226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
226661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
226861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame) {
226961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
227061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
227161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
227261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
227361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame) {
227461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFilledLen = 0;
227561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL,
227661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned int)NULL);
227761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = NULL;
227861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
227961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.flush();
228061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
228161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
228261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_flush_progress = false;
228361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes) {
228461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = LLONG_MAX;
228561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
228661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
228861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
228961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_timestamp_list.reset_ts_list();
229061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
229261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\n OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
229361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
229861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
229961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommandEvent
2300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
230161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
230261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Send the event to decoder pipe.  This is needed to generate the callbacks
230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   in decoder thread context.
2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
230661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
2307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
230861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
230961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
2310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
231161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::post_event(unsigned int p1,
231361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int p2,
231461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int id)
2315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
231661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet      =                      false;
231761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
231861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
231961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
232161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (id == m_fill_output_msg ||
232261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_FBD) {
232361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.insert_entry(p1,p2,id);
232461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (id == OMX_COMPONENT_GENERATE_ETB ||
232561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_EBD ||
232661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
232761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.insert_entry(p1,p2,id);
232861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
232961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cmd_q.insert_entry(p1,p2,id);
233061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet = true;
233361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Value of this pointer in post_event %p",this);
233461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    post_message(this, id);
233561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
233761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
2342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNoMore;
234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!profileLevelType)
234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
234661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (profileLevelType->nPortIndex == 0) {
234861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
235061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
235361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
235461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
235561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
235661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 2) {
235761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
235861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
235961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
236061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
236161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        profileLevelType->nProfileIndex);
236261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // TODO
236661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
236761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d\n",
236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        profileLevelType->nProfileIndex);
236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
237061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
237461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
237561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
237761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
238161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
238261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
238461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
238561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
238661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
238961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
239161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
239261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
239361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
239461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
239561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
239661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
239761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
239861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
239961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
240061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu\n", profileLevelType->nProfileIndex);
240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
240261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
240361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
240461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
240561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu\n", profileLevelType->nPortIndex);
240661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
240761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
240861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
241261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
241361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetParameter
2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
241561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Get Parameter method implementation
2417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
241861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
241961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
2420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
242161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
242261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Error None if successful.
2423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
242461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
242661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE paramIndex,
242761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_PTR     paramData)
2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("get_parameter: \n");
243261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
2433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Get Param in Invalid State\n");
2434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
243661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (paramData == NULL) {
2437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("Get Param in Invalid paramData \n");
2438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
244061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)paramIndex) {
244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition:
244261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
244361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
244461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
244561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition\n");
244661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = update_portdef(portDefn);
244761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (eRet == OMX_ErrorNone)
244861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_port_def = *portDefn;
244961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
245061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
245161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoInit:
245261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
245361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PORT_PARAM_TYPE *portParamType =
245461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PORT_PARAM_TYPE *) paramData;
245561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit\n");
245661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
245861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nSize = sizeof(portParamType);
245961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nPorts           = 2;
246061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nStartPortNumber = 0;
246161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
246261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
246361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat:
246461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
246561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
246661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
246761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat\n");
246861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
246961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
247061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portFmt->nSize             = sizeof(portFmt);
247161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
247261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (0 == portFmt->nPortIndex) {
247361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (0 == portFmt->nIndex) {
247461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
247561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eCompressionFormat = eCompressionFormat;
247661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
247761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
247861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                " NoMore compression formats\n");
247961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =  OMX_ErrorNoMore;
248061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
248161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (1 == portFmt->nPortIndex) {
248261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (0 == portFmt->nIndex)
248561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else if (1 == portFmt->nIndex)
248861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else {
249061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
249161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                " NoMore Color formats\n");
249261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =  OMX_ErrorNoMore;
249361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
249461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("returning %d\n", portFmt->eColorFormat);
249561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
249661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("get_parameter: Bad port index %d\n",
249761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (int)portFmt->nPortIndex);
249861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
249961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
250061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
250161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Component should support this port definition*/
250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamAudioInit:
250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PORT_PARAM_TYPE *audioPortParamType =
250661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PORT_PARAM_TYPE *) paramData;
250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit\n");
250861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
250961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nSize = sizeof(audioPortParamType);
251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nPorts           = 0;
251161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nStartPortNumber = 0;
251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
251361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Component should support this port definition*/
251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamImageInit:
251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PORT_PARAM_TYPE *imagePortParamType =
251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PORT_PARAM_TYPE *) paramData;
251961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit\n");
252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nSize = sizeof(imagePortParamType);
252261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nPorts           = 0;
252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nStartPortNumber = 0;
252461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
2525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Component should support this port definition*/
252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamOtherInit:
252961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
253061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x\n",
253161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
253261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet =OMX_ErrorUnsupportedIndex;
253361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
253461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamStandardComponentRole:
253661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_COMPONENTROLETYPE *comp_role;
253861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
253961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
254061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role->nSize = sizeof(*comp_role);
254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
254261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d\n",
254361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
254461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
254561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_MAX_STRINGNAME_SIZE);
254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
254761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
254861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Added for parameter test */
254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPriorityMgmt:
255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PRIORITYMGMTTYPE *priorityMgmType =
255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PRIORITYMGMTTYPE *) paramData;
255461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt\n");
255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                priorityMgmType->nSize = sizeof(priorityMgmType);
2557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
255961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Added for parameter test */
256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamCompBufferSupplier:
256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
256461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
256561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier\n");
256661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
256761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufferSupplierType->nSize = sizeof(bufferSupplierType);
256861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
256961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (0 == bufferSupplierType->nPortIndex)
257061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
257161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else if (1 == bufferSupplierType->nPortIndex)
257261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
257361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else
257461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
257561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
257661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc:
258061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
258161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x\n",
2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
258561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263:
258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
258761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x\n",
2588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
259161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4:
259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
259361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x\n",
259461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
259561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
259661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
259761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg2:
259861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
259961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x\n",
2600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
260161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
260261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
260361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoProfileLevelQuerySupported:
260461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
260561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x\n", paramIndex);
260661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
260761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
260861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = get_supported_profile_level_for_1080p(profileLevelType);
260961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
261061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
261161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
261261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
261461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage\n");
261561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
261661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
261761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
261861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (secure_mode) {
261961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
262061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                GRALLOC_USAGE_PRIVATE_UNCACHED);
262161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
262261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_
262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
262461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else
262561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
262661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
262761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_HIGH("nativeBuffersUsage->nUsage %x\n", (unsigned int)nativeBuffersUsage->nUsage);
262861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
262961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!\n");
263161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadParameter;
263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
263361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
2634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
263661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
263861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
263961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("get_parameter: unknown param %08x\n", paramIndex);
264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet =OMX_ErrorUnsupportedIndex;
264161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
2642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
264361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
264561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n get_parameter returning WxH(%d x %d) SxSH(%d x %d)\n",
264661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.frame_width,
264761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.frame_height,
264861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.stride,
264961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.scan_lines);
2650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
265161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
2656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
2658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
2660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
266161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((params == NULL) ||
266261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (params->nativeBuffer == NULL) ||
266361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (params->nativeBuffer->handle == NULL) ||
266461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            !m_enable_android_native_buffers)
2665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_use_android_native_buffers = OMX_TRUE;
2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    private_handle_t *handle = (private_handle_t *)nBuf->handle;
266961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_U8 *buffer = NULL;
267161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
267261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer = (OMX_U8*)mmap(0, handle->size,
2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
267461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer == MAP_FAILED) {
267561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
267661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
2677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
2680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
2681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
2682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
2684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
268761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
268861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::Setparameter
2689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
269061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
269161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Set Parameter method implementation.
2692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
269361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
269461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
2695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
269661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
269761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
269961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
270161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE paramIndex,
270261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR        paramData)
2703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
27056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    int ret=0;
27066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    struct v4l2_format fmt;
270761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
2708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Set Param in Invalid State\n");
2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (paramData == NULL) {
271261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Get Param in Invalid paramData \n");
271361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
2714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
271561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((m_state != OMX_StateLoaded) &&
271661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
271761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_out_bEnabled == OMX_TRUE) &&
271861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
271961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_inp_bEnabled == OMX_TRUE)) {
2720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Set Param in Invalid State \n");
2721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
2722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
272361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)paramIndex) {
272461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition:
2725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
272661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
272761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
272861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
272961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //been called.
273061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d\n",
273161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (int)portDefn->format.video.nFrameHeight,
273261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (int)portDefn->format.video.nFrameWidth);
273361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (OMX_DirOutput == portDefn->eDir) {
273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port\n");
273561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_display_id = portDefn->format.video.pNativeWindow;
273661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    unsigned int buffer_size;
273761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!client_buffers.get_buffer_req(buffer_size)) {
273861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n Error in getting buffer requirements");
273961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorBadParameter;
274061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
274261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->nBufferSize >=  drv_ctx.op_buf.buffer_size ) {
274361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
274561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = set_buffer_req(&drv_ctx.op_buf);
274661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (eRet == OMX_ErrorNone)
274761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                m_port_def = *portDefn;
274861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
274961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
275161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    portDefn->nBufferCountActual, portDefn->nBufferSize);
275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorBadParameter;
275361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
275561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (OMX_DirInput == portDefn->eDir) {
275661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((portDefn->format.video.xFramerate >> 16) > 0 &&
275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        // Frame rate only should be set if this is a "known value" or to
275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        // activate ts prediction logic (arbitrary mode only) sending input
276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        // timestamps with max value (LLONG_MAX).
276161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu",
276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.xFramerate >> 16);
276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
276461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.frame_rate.fps_denominator);
276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!drv_ctx.frame_rate.fps_numerator) {
276661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
276761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator = 30;
276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (drv_ctx.frame_rate.fps_denominator)
277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator = (int)
277161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
277261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.frame_rate.fps_denominator = 1;
277361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
277461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator;
277561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                frm_int, drv_ctx.frame_rate.fps_numerator /
277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (float)drv_ctx.frame_rate.fps_denominator);
277861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port\n");
278061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.video_resolution.frame_height !=
278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portDefn->format.video.nFrameHeight ||
278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.video_resolution.frame_width  !=
278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portDefn->format.video.nFrameWidth) {
278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("\n SetParam IP: WxH(%d x %d)\n",
278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.nFrameWidth,
278661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.nFrameHeight);
278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (portDefn->format.video.nFrameHeight != 0x0 &&
278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.nFrameWidth != 0x0) {
278961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            update_resolution(portDefn->format.video.nFrameWidth,
279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    portDefn->format.video.nFrameHeight);
279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
279261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
279461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.fmt.pix_mp.pixelformat = output_capability;
279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_LOW("\n fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d \n",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
279661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
279761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (ret) {
279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_ERROR("\n Set Resolution failed");
279961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                eRet = OMX_ErrorUnsupportedSetting;
280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else
280161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                eRet = get_buffer_req(&drv_ctx.op_buf);
280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
280361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
280561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (~(buffer_prop->alignment - 1));
280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = set_buffer_req(buffer_prop);
281061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)\n",
281261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
281361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->nBufferCountActual, portDefn->nBufferSize);
281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorBadParameter;
281561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
281661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portDefn->eDir ==  OMX_DirMax) {
281761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
281861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (int)portDefn->nPortIndex);
281961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
2821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
282261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
282361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat:
2824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
282661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int ret=0;
282861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_format fmt;
282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d\n",
283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat);
283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
283261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (1 == portFmt->nPortIndex) {
283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
283661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.pixelformat = capture_capability;
283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    enum vdec_output_fromat op_format;
283861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
283961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) ||
284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar))
284161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else if (portFmt->eColorFormat ==
284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (OMX_COLOR_FORMATTYPE)
284461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        op_format = VDEC_YUV_FORMAT_TILE_4x2;
284661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else
284761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorBadParameter;
284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (eRet == OMX_ErrorNone) {
285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.output_format = op_format;
285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ret) {
285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\n Set output format failed");
285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorUnsupportedSetting;
285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            /*TODO: How to handle this case */
285661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
285761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = get_buffer_req(&drv_ctx.op_buf);
285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (eRet == OMX_ErrorNone) {
286161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\n Set color format failed");
286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorBadParameter;
286461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
286561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
286661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
2867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
286861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
287061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexPortDefn:
2871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d\n",
287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->nFramePackingFormat);
287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
287761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Input port */
287861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (portFmt->nPortIndex == 0) {
287961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (secure_mode) {
288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            arbitrary_bytes = false;
288261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorUnsupportedSetting;
288461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
288561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            arbitrary_bytes = true;
288661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (portFmt->nFramePackingFormat ==
288861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
288961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        arbitrary_bytes = false;
289061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
289161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu\n",
289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portFmt->nFramePackingFormat);
289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
289461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
289661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port\n");
289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
289861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_out_mem_region_smi = OMX_TRUE;
290161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set\n");
290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_use_output_pmem = OMX_TRUE;
290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
290561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
290661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
2907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
290861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamStandardComponentRole:
29116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            {
291261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_COMPONENTROLETYPE *comp_role;
291361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s\n",
291561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        comp_role->cRole);
291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
291761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ((m_state == OMX_StateLoaded)&&
291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
291961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("Set Parameter called in valid state");
292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
292261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorIncorrectStateOperation;
292361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
292461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
292561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
292661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
292761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
292861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
292961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
293061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
293161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((char*)comp_role->cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
293661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
293761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
293861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
293961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
294361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
294461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
294561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
294661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
294761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
294861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
294961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
295061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
295161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
295261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
295361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
295461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
295561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
295661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
295761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
295861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
295961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
296061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
296161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
296261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ) {
296361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) {
296461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
296561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
296661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
296761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
296961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ) {
297261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) {
297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
297461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
297561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
297761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE))) {
298161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
298261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
298361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s\n", comp_role->cRole);
298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
298561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("Setparameter: unknown param %s\n", drv_ctx.kind);
298861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorInvalidComponentName;
298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
299061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
29916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
299261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPriorityMgmt:
2994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state != OMX_StateLoaded) {
299661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State\n");
299761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorIncorrectStateOperation;
299861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
299961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
300061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d\n",
300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        priorityMgmtype->nGroupID);
3002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d\n",
300461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        priorityMgmtype->nGroupPriority);
3005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
300661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
300761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
3008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
300961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
301061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamCompBufferSupplier:
30136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            {
301461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
301561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d\n",
301661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufferSupplierType->eBufferSupplier);
301761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
301861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
301961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
302061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else
302161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
302261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
302361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
302461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
302561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
30266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc:
302861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
302961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d\n",
303061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
303261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263:
303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
303561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d\n",
303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
303961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4:
304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
304161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d\n",
304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
304361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
304461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg2:
304661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d\n",
304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
305061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
305161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoDecoderPictureOrder:
305261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control control;
305661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int pic_order,rc=0;
305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d\n",
305861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pictureOrder->eOutputPictureOrder);
305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
306261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    time_stamp_dts.set_timestamp_reorder_mode(false);
306461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
306561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadParameter;
306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (eRet == OMX_ErrorNone) {
306761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.value = pic_order;
306961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (rc) {
307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n Set picture order failed");
307261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
307461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
307661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamConcealMBMapExtraData:
307861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode)
307961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
308061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else {
308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n secure mode setting not supported");
308361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
308661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamFrameInfoExtraData:
308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
308861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode)
308961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            ((QOMX_ENABLETYPE *)paramData)->bEnable);
309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else {
309261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\n secure mode setting not supported");
309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
309461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
309561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
309661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
309761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamInterlaceExtraData:
309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode)
309961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
310061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else {
310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n secure mode setting not supported");
310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
310561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamH264TimeInfo:
310761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode)
310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
310961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else {
311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n secure mode setting not supported");
311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoDivx:
311661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
311761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
311861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
311961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexPlatformPvt:
312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
312261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port\n");
312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
312461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
312661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
312761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
312861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_pvt_entry_pmem = OMX_TRUE;
312961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
313061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set\n");
313161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_use_output_pmem = OMX_TRUE;
313261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
313361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
313461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
313561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
313661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
313761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
313961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
314061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
314161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control control;
314261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int rc;
314361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.idr_only_decoding = 1;
314461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
314561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
314661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
314761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc) {
314861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\n Set picture order failed");
314961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
315061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
315161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
315261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
315361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
315461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (rc) {
315561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n Sync frame setting failed");
315661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
315761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
315861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
315961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
316061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
3161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
316261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamIndexExtraDataType:
316361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
316461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
316561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
316661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
316761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (extradataIndexType->bEnabled == OMX_TRUE) &&
316861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (extradataIndexType->nPortIndex == 1)) {
316961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
317061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
317161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
317261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
317361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
317461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
317561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
317661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamEnableSmoothStreaming:
3177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
317861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control control;
317961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_format fmt;
318061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
318161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.value = 1;
318261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
318361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc < 0) {
318461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
318561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorHardware;
318661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
318761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
318861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
3189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
319061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Need to allow following two set_parameters even in Idle
319161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             * state. This is ANDROID architecture which is not in sync
319261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             * with openmax standard. */
319361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
319461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
319561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
319661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (enableNativeBuffers) {
319761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_enable_android_native_buffers = enableNativeBuffers->enable;
319861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
319961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
320061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
320161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
320261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
320361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = use_android_native_buffer(hComp, paramData);
320461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
320561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
3206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
320761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamEnableTimeStampReorder:
320861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
320961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
321061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
321161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (reorder->bEnable == OMX_TRUE) {
321261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frm_int =0;
321361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        time_stamp_dts.set_timestamp_reorder_mode(true);
321461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else
321561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        time_stamp_dts.set_timestamp_reorder_mode(false);
321661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
321761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    time_stamp_dts.set_timestamp_reorder_mode(false);
321861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (reorder->bEnable == OMX_TRUE) {
321961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
322061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
322161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
322261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
322361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
322461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
322561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
322661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Setparameter: unknown param %d\n", paramIndex);
322761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedIndex;
322861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
322961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
323061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
323461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
323561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetConfig
3236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
323761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
323861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Get Config Method implementation.
3239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
324061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
324161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
324361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
324461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
3245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
324661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
324861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE configIndex,
324961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_PTR     configData)
3250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
325161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
3252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
325361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
325461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
325561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
325661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
325761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
325861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)configIndex) {
325961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexConfigInterlaced:
326061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
326161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
326261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
326361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (configFmt->nPortIndex == 1) {
326461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (configFmt->nIndex == 0) {
326561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
326661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (configFmt->nIndex == 1) {
326761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        configFmt->eInterlaceType =
326861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
326961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (configFmt->nIndex == 2) {
327061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        configFmt->eInterlaceType =
327161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
327261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
327361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
327461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                " NoMore Interlaced formats\n");
327561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorNoMore;
327661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
327761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
327861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
327961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port\n",
328061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (int)configFmt->nPortIndex);
328161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
328261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
328361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
328461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
328561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexQueryNumberOfVideoDecInstance:
328661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
328761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
328861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
328961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                decoderinstances->nNumOfInstances = 16;
329061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*TODO: How to handle this case */
329161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
329261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
329361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexConfigVideoFramePackingArrangement:
329461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
329561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
329661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
329761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
329861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->get_frame_pack_data(configFmt);
329961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
330061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
330161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
330261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
330361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
330461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigCommonOutputCrop:
330561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
330661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
330761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
330861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
330961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
331061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
331161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
331261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("get_config: unknown param %d\n",configIndex);
331361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
331461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
331561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
331661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
331761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
331861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
332261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
332361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SetConfig
3324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
332561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
332661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Set Config method implementation
3327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
332861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
332961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
333161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
333261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
333361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
333561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE configIndex,
333661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR        configData)
3337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
333861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
333961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Get Config in Invalid State\n");
334061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
334161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
334261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
334361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
334461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_VIDEO_CONFIG_NALSIZE *pNal;
334561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
334661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Set Config Called");
334761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
334861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateExecuting) {
334961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("set_config:Ignore in Exe state\n");
335061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
335161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
335261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
335361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData) {
335461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
335561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData called");
335661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) {
335761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Index OMX_IndexVendorVideoExtraData AVC");
335861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U32 extra_size;
335961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Parsing done here for the AVC atom is definitely not generic
336061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Currently this piece of code is working, but certainly
336161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // not tested with all .mp4 files.
336261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Incase of failure, we might need to revisit this
336361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // for a generic piece of code.
336461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
336561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Retrieve size of NAL length field
336661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // byte #4 contains the size of NAL lenght field
336761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_length = (config->pData[4] & 0x03) + 1;
336861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
336961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_size = 0;
337061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (nal_length > 2) {
337161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
337261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                extra_size = (nal_length - 2) * 2;
337361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
337461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
337561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // SPS starts from byte #6
337661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
337761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U8 *pDestBuf;
3378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
337961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
338061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // minus 6 --> SPS starts from byte #6
338161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // minus 1 --> picture param set byte to be ignored from avcatom
338261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
338361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
338461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U32 len;
338561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U8 index = 0;
338661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // case where SPS+PPS is sent as part of set_config
338761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pDestBuf = m_vendor_config.pData;
338861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
338961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]\n",
339061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_vendor_config.nPortIndex,
339161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_vendor_config.nDataSize,
339261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_vendor_config.pData);
339361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (index < 2) {
339461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                uint8 *psize;
339561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len = *pSrcBuf;
339661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len = len << 8;
339761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len |= *(pSrcBuf + 1);
339861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psize = (uint8 *) & len;
339961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
340061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                for (unsigned int i = 0; i < nal_length; i++) {
340161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pDestBuf[i] = psize[nal_length - 1 - i];
340261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
340361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //memcpy(pDestBuf,pSrcBuf,(len+2));
340461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pDestBuf += len + nal_length;
340561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pSrcBuf += len + 2;
340661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index++;
340761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pSrcBuf++;   // skip picture param set
340861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len = 0;
340961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
341061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
341161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) {
3412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
3413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nDataSize = config->nDataSize;
341461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
341561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
341661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) {
341761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_vendor_config.pData) {
341861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_vendor_config.pData);
341961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData = NULL;
342061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize = 0;
342161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
342261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
342361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (((*((OMX_U32 *) config->pData)) &
342461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        VC1_SP_MP_START_CODE_MASK) ==
342561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    VC1_SP_MP_START_CODE) {
342661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_config - VC1 simple/main profile\n");
342761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nPortIndex = config->nPortIndex;
342861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize = config->nDataSize;
342961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData =
343061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_U8 *) malloc(config->nDataSize);
343161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(m_vendor_config.pData, config->pData,
343261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        config->nDataSize);
343361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vc1_profile = VC1_SP_MP_RCV;
343461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) {
343561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_config - VC1 Advance profile\n");
343661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nPortIndex = config->nPortIndex;
343761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize = config->nDataSize;
343861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData =
343961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_U8 *) malloc((config->nDataSize));
344061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(m_vendor_config.pData, config->pData,
344161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        config->nDataSize);
344261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vc1_profile = VC1_AP;
344361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) {
344461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only\n");
344561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nPortIndex = config->nPortIndex;
344661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize  = config->nDataSize;
344761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
344861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
344961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vc1_profile = VC1_SP_MP_RCV;
345061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
345161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile\n");
345261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
345461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
345561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (configIndex == OMX_IndexConfigVideoNalSize) {
345661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
345761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
345861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_length = pNal->nNaluBytes;
345961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
346061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
346161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
3462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
346461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
3465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
346861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
346961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetExtensionIndex
3470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
347161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
347261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX GetExtensionIndex method implementaion.  <TBD>
3473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
347461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
347561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
347761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
347861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
3479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
348061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
348261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_STRING      paramName,
348361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_INDEXTYPE* indexType)
3484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
348561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State\n");
3487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
348861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
3489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
349061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) {
3491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
3492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
349461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
3495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
349661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
3497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
349861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
3499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Extension: %s is supported\n", paramName);
3500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
350161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
3503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
350561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Extension: %s not implemented\n", paramName);
3507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorNotImplemented;
3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
351361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
351461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetState
3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
351661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
351761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns the state information back to the caller.<TBD>
3518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
351961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
352061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
352261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
352361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Error None if everything is successful.
352461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
352661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_STATETYPE* state)
3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
352861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *state = m_state;
352961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("get_state: Returning the state %d\n",*state);
353061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
3531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
353461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
353561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentTunnelRequest
3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
353761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
353861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Component Tunnel Request method implementation. <TBD>
3539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
354061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
354161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
354361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
354461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
3545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
354661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
354861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
354961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE        peerComponent,
355061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                    peerPort,
355161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
3552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
355361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented\n");
355461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
3555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
355861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
355961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseOutputBuffer
3560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
356161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
356261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper function for Use buffer in the input pin
3563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
356461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
356561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
3566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
356761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
356861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
3569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
357061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
35716eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_extradata()
35726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
35736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
357461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.extradata_info.buffer_size) {
357561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
357661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
357761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
357861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.extradata_info.ion);
357961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
358061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
358161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("allocate extradata memory size %d\n", drv_ctx.extradata_info.size);
358261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
358361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.size, 4096,
358461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.extradata_info.ion.ion_alloc_data,
358561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.extradata_info.ion.fd_ion_data, 0);
358661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
358761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n");
358861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
358961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
359061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
359161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.size,
359261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                PROT_READ|PROT_WRITE, MAP_SHARED,
359361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
359461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
359561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to map extradata memory\n");
359661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
359761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.extradata_info.ion);
359861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
359961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
360061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(drv_ctx.extradata_info.uaddr, 0, drv_ctx.extradata_info.size);
360161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
36026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
360361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
36046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
36056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
360661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_extradata()
360761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
36086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
360961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.extradata_info.uaddr) {
361061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
361161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
361261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_ion_memory(&drv_ctx.extradata_info.ion);
361361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
361461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
36156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
36166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
36176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
3618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_output_buffer(
361961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
362061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
362161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
362261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
362361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
362461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
3625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
362661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
362761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
362861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned                         i= 0; // Temporary counter
362961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
363061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_PTR privateAppData = NULL;
363161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    private_handle_t *handle = NULL;
363261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *buff = buffer;
363361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
363461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
363561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
36366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
363761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
363861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
363961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_output_headers();
364061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet == OMX_ErrorNone)
364161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_extradata();
364261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
364361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
364461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
364561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
364661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_out_bm_count,i)) {
364761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
364861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
36496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
365061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
365161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
365261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i >= drv_ctx.op_buf.actualcount) {
365361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Already using %d o/p buffers\n", drv_ctx.op_buf.actualcount);
365461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
365561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
36566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
365761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
365861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
365961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
366061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_use_android_native_buffers) {
366161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
366261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sp<android_native_buffer_t> nBuf = params->nativeBuffer;
366361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                handle = (private_handle_t *)nBuf->handle;
366461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = params->pAppPrivate;
366561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
366661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                handle = (private_handle_t *)buff;
366761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
366861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
366961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
367061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
367161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
367261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        " expected %u, got %lu",
367361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
367461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
367561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
367661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
367761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.op_buf.buffer_size = (OMX_U32)handle->size;
367861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_use_android_native_buffers) {
367961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
368061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buff =  (OMX_U8*)mmap(0, handle->size,
368161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
368261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (buff == MAP_FAILED) {
368361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
368461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
368561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
36866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                }
36876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
36886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#if defined(_ANDROID_ICS_)
368961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            native_buffer[i].nativehandle = handle;
369061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            native_buffer[i].privatehandle = handle;
36916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
369261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!handle) {
369361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
369461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
369561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
369661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
369761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].offset = 0;
369861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
369961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].mmaped_size =
370061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
370161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
3702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
370461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!ouput_egl_buffers && !m_use_output_pmem) {
3705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
370661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("allocate output buffer memory size %d\n", drv_ctx.op_buf.buffer_size);
370761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
370861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
370961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
371061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
371161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
371261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("ION device fd is bad %d\n", drv_ctx.op_buf_ion_info[i].ion_device_fd);
371361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
371461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
371561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
371661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                      drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
3717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
371861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
371961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                      open (MEM_DEVICE,O_RDWR);
3720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
372161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
372261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
372361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
372461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
372661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
372761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
372861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].pmem_fd = \
372961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                          open (MEM_DEVICE,O_RDWR);
373061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
373161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d\n", drv_ctx.ptr_outputbuffer[i].pmem_fd);
373261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
373361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
373461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
373661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
373761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.buffer_size,
373861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.alignment)) {
373961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
374061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
374161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
374261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
374461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
374561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].bufferaddr =
374661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
374761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                PROT_READ|PROT_WRITE, MAP_SHARED,
374861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
374961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
375061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
3751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
375261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
3753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
375461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Unable to mmap output buffer\n");
375561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
375661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
375761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
375861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = 0;
375961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
376061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
376161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
376261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Use_op_buf: out_pmem=%d",m_use_output_pmem);
376361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!appData || !bytes ) {
376461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!secure_mode && !buffer) {
376561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n Bad parameters for use buffer in EGL image case");
376661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
376761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
376861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
376961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
377061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
377161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
377261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
377361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!pmem_list->entryList || !pmem_list->entryList->entry ||
377461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !pmem_list->nEntries ||
377561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
377661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\n Pmem info not valid in use buffer");
377761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
377861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
377961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
378061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_list->entryList->entry;
378161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
378261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_info->pmem_fd);
378361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
378461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
378561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
378661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].mmaped_size =
378761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
378861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
3789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
379061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
379161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
379261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
379361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_out_mem_ptr + i );
379461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
379561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
379661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
379761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
379861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof (vdec_bufferpayload));
379961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
380061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
380161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr,
380261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd );
380361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
380461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = i;
380561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
380661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
380761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].length = drv_ctx.op_buf.buffer_size;
380861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
380961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
381061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
381161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
381261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].data_offset = 0;
381361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
381461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
381561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
381661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
381761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
381861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
381961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
382061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
382161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].data_offset = 0;
382261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
382361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
382461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
3825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
382661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = plane;
382761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = drv_ctx.num_planes;
382861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
382961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
3830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
383161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
383261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
383361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
383461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
3835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
383761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
383861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            enum v4l2_buf_type buf_type;
383961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
384061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
384161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
384261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
384361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                streaming[CAPTURE_PORT] = true;
384461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
384561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
384761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
384861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
384961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
385061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
385161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
385261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
385361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = buff;
385461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
385561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (*bufferHdr)->pAppPrivate = privateAppData;
385661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_out_bm_count,i);
385761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
385861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
386261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
386361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::use_input_heap_buffers
3864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
386561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
386661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use Buffer Heap allocation method implementation.
3867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
386861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
386961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
387161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
387261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None , if everything successful.
3873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
387461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
387661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
387761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
387861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
387961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
388061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
388161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
3882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
388361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Inside %s, %p\n", __FUNCTION__, buffer);
388461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
388561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_heap_ptr)
388661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
388761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
388861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.actualcount);
388961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_phdr_pmem_ptr)
389061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
389161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
389261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.actualcount);
389361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
389461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Insufficent memory");
389561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
389661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
389761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input_use_buffer = true;
389861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
389961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
390061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
390161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
390261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
390361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
390461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
390561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
390661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
390761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt],
390861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL, (unsigned)NULL)) {
390961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
391061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
391161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
391261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_in_alloc_cnt++;
391361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
391461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("All i/p buffers have been set!");
391561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
391661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
391761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
392161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
392261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseBuffer
3923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
392461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
392561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use Buffer method implementation.
3926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
392761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
392861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
393061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
393161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None , if everything successful.
3932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
393361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_buffer(
393561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
393661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
393761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
393861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
393961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
394061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
3941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
394261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE error = OMX_ErrorNone;
394361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
394461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
394561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || bytes == 0) {
394661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode && buffer == NULL) {
394761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
394861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
394961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
395061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
395161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
395261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Use Buffer in Invalid State\n");
395361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
395461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
395561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX)
395661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
395761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
395861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
395961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
396061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
396161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = OMX_ErrorBadPortIndex;
396261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
396361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
396461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (error == OMX_ErrorNone) {
396561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
396661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Send the callback now
396761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
396861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandStateSet,OMX_StateIdle,
396961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
397061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
397161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
397261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
397361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
397461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortEnable,
397561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_INPUT_PORT_INDEX,
397661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
397761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
397861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
397961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
398061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortEnable,
398161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_OUTPUT_PORT_INDEX,
398261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
398361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
398461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
398561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return error;
398661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
3987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
398961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
3990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
399161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
399261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr[bufferindex].pBuffer)
399361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free(m_inp_heap_ptr[bufferindex].pBuffer);
399461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[bufferindex].pBuffer = NULL;
399561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
399661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_bufferHdr)
399761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_input_buffer(pmem_bufferHdr);
399861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
3999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
400361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
400461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
400561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
400661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
400861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufferHdr - m_inp_mem_ptr;
4009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
401061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
401161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
401261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Free Input Buffer index = %d",index);
401361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) {
401461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_setbuffer_cmd setbuffers;
401561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
401661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
401761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sizeof (vdec_bufferpayload));
401861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n unmap the input buffer fd=%d",
4019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].pmem_fd);
402061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n unmap the input buffer size=%d  address = %d",
4021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].mmaped_size,
4022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].bufferaddr);
402361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
402461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_inputbuffer[index].mmaped_size);
402561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
402661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
402761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
402861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_desc_buffer_ptr[index].buf_addr);
402961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_desc_buffer_ptr[index].buf_addr = NULL;
403061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_desc_buffer_ptr[index].desc_data_size = 0;
403161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
403361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
4034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
403561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
403861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
4039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
404361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
4044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
404561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
404661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
404761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
404961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufferHdr - m_out_mem_ptr;
405061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d",index);
4051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
405261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < drv_ctx.op_buf.actualcount
405361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && drv_ctx.ptr_outputbuffer) {
405461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Free ouput Buffer index = %d addr = %x", index,
405561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[index].bufferaddr);
4056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
405761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct vdec_setbuffer_cmd setbuffers;
405861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
405961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
406061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof (vdec_bufferpayload));
4061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
406261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
406361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
406461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
406561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[index].mmaped_size);
406661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
406761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
406861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
4069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
407061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) {
407161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n unmap the output buffer fd = %d",
407261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].pmem_fd);
407361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n unmap the ouput buffer size=%d  address = %d",
407461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
407561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].bufferaddr);
407661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
407761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
407861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
407961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
4080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
408161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
4082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
408361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
408561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
408761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_output_done()) {
408861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_extradata();
408961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
40906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
4091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
409261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
4093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
409761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE **bufferHdr,
409861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32              port,
409961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_PTR              appData,
410061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32              bytes)
4101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
410261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *input = NULL;
410361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char *buf_addr = NULL;
410461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
410561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned   i = 0;
410661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
410761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Sanity Check*/
410861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL) {
410961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
411061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
411161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
411261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_heap_ptr == NULL) {
411361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
411461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                         calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
411561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 drv_ctx.ip_buf.actualcount);
411661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
411761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
411861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  drv_ctx.ip_buf.actualcount);
411961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
412061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr == NULL) {
412161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n m_inp_heap_ptr Allocation failed ");
412261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
412361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
412461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
412561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
412661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Find a Free index*/
412761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
412861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
412961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
413061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
413161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
413261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
413361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
413461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < drv_ctx.ip_buf.actualcount) {
413561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
413661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
413761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buf_addr == NULL) {
413861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
413961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
414061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
414161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_inp_heap_ptr + i);
414261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input = *bufferHdr;
414361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_heap_inp_bm_count,i);
414461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
414561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pBuffer           = (OMX_U8 *)buf_addr;
414661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
414761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nVersion.nVersion = OMX_SPEC_VERSION;
414861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
414961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pAppPrivate       = appData;
415061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
415161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Address of Heap Buffer %p",*bufferHdr );
415261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
415361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
415461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Add the Buffers to freeq*/
415561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i],
415661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL, (unsigned)NULL)) {
415761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\nERROR:Free_q is full");
415861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
415961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
416061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
416161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
416261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
416361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
416461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
417061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
417161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateInputBuffer
4172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
417361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
417461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper function for allocate buffer in the input pin
4175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
417661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
417761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
417961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
418061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
4181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
418261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
418461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
418561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
418661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
418761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
418861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes)
4189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
419261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
419361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *input = NULL;
419461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned   i = 0;
419561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char *buf_addr = NULL;
419661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int pmem_fd = -1;
4197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bytes != drv_ctx.ip_buf.buffer_size) {
419961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Requested Size is wrong %d epected is %d",
420061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bytes, drv_ctx.ip_buf.buffer_size);
420161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
420261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
420461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_mem_ptr) {
420561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
420661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.actualcount,
420761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.buffer_size);
4208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
420961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
421061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
4211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
421261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_mem_ptr == NULL) {
421361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
421461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
421661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
421761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
4218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
421961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ptr_inputbuffer == NULL) {
422061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
422161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
422361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
422461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
4225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
422661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ip_buf_ion_info == NULL) {
422761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
422861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
423161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
423261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
4233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
423461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
4235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
423661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
423961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
424061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
424161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Free Input Buffer Index %d",i);
424261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
424361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
424661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < drv_ctx.ip_buf.actualcount) {
424761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_buffer buf;
424861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_plane plane;
424961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc;
42506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
4251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
425261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Allocate input Buffer size %d\n", drv_ctx.ip_buf.buffer_size);
425361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
425461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
425561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
425661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
425761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
425861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
425961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
426061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
4261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
426261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = open (MEM_DEVICE,O_RDWR);
4263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
426461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd < 0) {
426561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
426661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
426761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
426961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd == 0) {
427061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_fd = open (MEM_DEVICE,O_RDWR);
4271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
427261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_fd < 0) {
427361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n open failed for pmem/adsp for input buffer");
427461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
427561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
427661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
427861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
427961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.alignment)) {
428061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
428161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(pmem_fd);
428261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
428361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
428561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
428661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_addr = (unsigned char *)mmap(NULL,
428761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.buffer_size,
428861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
4289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
429061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buf_addr == MAP_FAILED) {
429161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(pmem_fd);
4292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
429361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
4294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
429561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n Map Failed to allocate input buffer");
429661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
429761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
429861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
429961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_inp_mem_ptr + i);
430061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
430161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
430261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
430361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
430461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
430561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
430661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
430761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].offset = 0;
430861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
430961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
431061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = i;
431161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
431261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
431361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.bytesused = 0;
431461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
431561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
431661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
431761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.reserved[1] = 0;
431861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
431961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = &plane;
432061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = 1;
432161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
432261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Set the input Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]);
432361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
432461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
432561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
432661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
432761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to prepare bufs\n");
432861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
432961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
4330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
433261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input = *bufferHdr;
433361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_inp_bm_count,i);
433461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Buffer address %p of pmem",*bufferHdr);
433561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
433661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
433761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
433861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input->pBuffer           = (OMX_U8 *)buf_addr;
433961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
434061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nVersion.nVersion = OMX_SPEC_VERSION;
434161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
434261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pAppPrivate       = appData;
434361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
434461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
434561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
434661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.disable_dmx) {
434761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_desc_buffer(i);
434861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
434961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
435061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:Input Buffer Index not found");
435161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
435261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
435361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
435861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
435961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateOutputBuffer
4360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
436161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
436261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper fn for AllocateBuffer in the output pin
4363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
436461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
436561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
4366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
436761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
436861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went well.
4369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
437061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
437261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
437361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
437461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
437561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
437661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes)
4377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
437861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
437961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
438061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned                         i= 0; // Temporary counter
438161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
438261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
4383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
438461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ion_device_fd =-1;
438561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ion_allocation_data ion_alloc_data;
438661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ion_fd_data fd_ion_data;
4387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
438861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
438961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
439061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount,
439161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size);
439261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nBufHdrSize        = 0;
439361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformEntrySize = 0;
439461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformListSize  = 0;
439561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPMEMInfoSize = 0;
439661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int pmem_fd = -1;
439761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned char *pmem_baseaddress = NULL;
439861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
439961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
440061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
440161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
440261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
440361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)\n",
440461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
440561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufHdrSize        = drv_ctx.op_buf.actualcount *
440661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE);
440761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
440861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
440961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
441061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformListSize  = drv_ctx.op_buf.actualcount *
441161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
441261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
441361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
441461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
441561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
441661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof(OMX_BUFFERHEADERTYPE),
441761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,
441861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPlatformListSize);
441961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d \n",nPlatformEntrySize,
442061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
4421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
442261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("allocate outputBuffer size %d \n",drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount);
442361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_device_fd = alloc_map_ion_memory(
442461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
442561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.alignment,
442661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0);
442761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ion_device_fd < 0) {
442861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
442961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
443061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = fd_ion_data.fd;
4431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
443261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = open (MEM_DEVICE,O_RDWR);
4433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
443461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd < 0) {
443561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
443661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.buffer_size);
443761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
443861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
444061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd == 0) {
444161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_fd = open (MEM_DEVICE,O_RDWR);
4442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
444361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_fd < 0) {
444461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\nERROR:pmem fd for output buffer %d",
444561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size);
444661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
444761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
444861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
445061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
445161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.actualcount,
445261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.alignment)) {
445361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n align_pmem_buffers() failed");
445461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(pmem_fd);
445561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
445661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
445861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
445961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_baseaddress = (unsigned char *)mmap(NULL,
446061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (drv_ctx.op_buf.buffer_size *
446161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     drv_ctx.op_buf.actualcount),
446261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
446361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_baseaddress == MAP_FAILED) {
446461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",
446561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size);
446661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(pmem_fd);
4467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
446861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
4469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
447061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
447161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
447261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
447361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
447461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Alloc mem for platform specific info
447561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *pPtr=NULL;
447661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
447761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,1);
447861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
447961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   calloc (sizeof(struct vdec_bufferpayload),
448061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.op_buf.actualcount);
448161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
448261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 calloc (sizeof (struct vdec_output_frameinfo),
448361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         drv_ctx.op_buf.actualcount);
4484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
448561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
448661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc (sizeof(struct vdec_ion),
448761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          drv_ctx.op_buf.actualcount);
4488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
449061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
449161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && drv_ctx.ptr_respbuffer) {
449261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[0].mmaped_size =
449361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (drv_ctx.op_buf.buffer_size *
449461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 drv_ctx.op_buf.actualcount);
449561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufHdr          =  m_out_mem_ptr;
449661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
449761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
449861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_list)  + nPlatformListSize);
449961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
450061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_entry) + nPlatformEntrySize);
450161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformList   = m_platform_list;
450261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformEntry  = m_platform_entry;
450361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPMEMInfo       = m_pmem_info;
450461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
450561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
450661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
450761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Settting the entire storage nicely
450861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr, m_out_mem_ptr,pPlatformEntry);
450961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
451061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
451161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
451261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
451361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Set the values when we determine the right HxW param
451461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nAllocLen          = bytes;
451561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nFilledLen         = 0;
451661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pAppPrivate        = appData;
451761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
451861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Platform specific PMEM Information
451961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform Entry
452061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d\n",i);
452161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
452261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->entry      = pPMEMInfo;
452361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform List
452461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->nEntries    = 1;
452561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->entryList   = pPlatformEntry;
452661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep pBuffer NULL till vdec is opened
452761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pBuffer            = NULL;
452861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOffset            = 0;
452961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
453061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
453161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->pmem_fd = 0;
453261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pPlatformPrivate = pPlatformList;
453361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
453461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
453561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_pmem_info[i].pmem_fd = pmem_fd;
4536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
453761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
453861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
453961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
4540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
454261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Create a mapping between buffers*/
454361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
454461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer[i].client_data = (void *)\
454561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        &drv_ctx.ptr_outputbuffer[i];
454661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
454761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr =
454861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
454961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
455061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n pmem_fd = %d offset = %d address = %p",
455161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
455261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[i].bufferaddr);
455361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Move the buffer and buffer header pointers
455461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr++;
455561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo++;
455661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry++;
455761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList++;
455861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
455961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
456061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
456161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr, pPtr);
456261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_out_mem_ptr) {
456361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_out_mem_ptr);
456461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr = NULL;
456561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
456661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pPtr) {
456761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(pPtr);
456861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPtr = NULL;
456961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
457061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer) {
457161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_outputbuffer);
457261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer = NULL;
457361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
457461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_respbuffer) {
457561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_respbuffer);
457661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer = NULL;
457761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
457961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.op_buf_ion_info) {
458061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Free o/p ion context");
458161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.op_buf_ion_info);
458261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info = NULL;
458361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
458561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet =  OMX_ErrorInsufficientResources;
458661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
458761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet == OMX_ErrorNone)
458861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_extradata();
458961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
459061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
459161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
459261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
459361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Found a Free Output Buffer %d",i);
459461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
459561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
459861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
459961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i < drv_ctx.op_buf.actualcount) {
460061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct v4l2_buffer buf;
460161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct v4l2_plane plane[VIDEO_MAX_PLANES];
460261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int rc;
460361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
460461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
460561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].buffer_len =
460661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size;
460761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
460861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *bufferHdr = (m_out_mem_ptr + i );
460961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (secure_mode) {
461061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
461161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
461261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
461361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
461461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.index = i;
461561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
461661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.memory = V4L2_MEMORY_USERPTR;
461761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].length = drv_ctx.op_buf.buffer_size;
461861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
461961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
46206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
462161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
46226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
462361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
462461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].data_offset = 0;
462561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
462661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
462761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
462861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
4629b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#ifdef USE_ION
463061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
4631b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#endif
463261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
463361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].data_offset = 0;
463461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (extra_idx >= VIDEO_MAX_PLANES) {
463561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d\n", extra_idx);
463661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
463761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
463861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.m.planes = plane;
463961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.length = drv_ctx.num_planes;
464061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
464161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
464261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc) {
464361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*TODO: How to handle this case */
464461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
464561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
464661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
464761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
464861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                enum v4l2_buf_type buf_type;
464961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
465061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
465161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc) {
465261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
465361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
465461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    streaming[CAPTURE_PORT] = true;
465561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("\n STREAMON Successful \n ");
465661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
465761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
465861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
465961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
466061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pAppPrivate = appData;
466161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_out_bm_count,i);
466261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
466361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient \n");
466461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
466561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
466861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer  -- API Call
4673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
467461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
467561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateBuffer
4676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
467761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
467861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
4679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
468061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
468161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
468361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
468461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
4685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
468661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
468861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
468961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
469061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                     appData,
469161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                       bytes)
4692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned i = 0;
4694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
4695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Allocate buffer on port %d \n", (int)port);
469761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
4698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State\n");
4699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
4700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
470261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
470361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (arbitrary_bytes) {
470461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
470561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
470661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
470761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
470861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
47096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
47106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                appData,bytes);
471161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
471261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d\n",(int)port);
471361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
4714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
471661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
471761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (allocate_done()) {
471861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
4719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
4720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
4721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandStateSet,OMX_StateIdle,
472261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
4723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
472561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
472661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
472761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
472861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,
4729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_CORE_INPUT_PORT_INDEX,
4730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
473161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
473361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
473461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
473561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
4736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandPortEnable,
473761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_CORE_OUTPUT_PORT_INDEX,
473861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
4739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d\n",eRet);
4743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
4744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call
4747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
474861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
474961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::FreeBuffer
4750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
475161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
4752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
475361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
475461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
475661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
475761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
475961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
476161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                 port,
476261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
4763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
4765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int nPortIndex;
4766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("In for decoder free_buffer \n");
4767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
476861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateIdle &&
476961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
4770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending\n");
477161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
477261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
4773dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("Free Buffer while port %d disabled\n", port);
477461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
477561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
477661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (port == OMX_CORE_OUTPUT_PORT_INDEX &&
477761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) {
477861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Free Buffer while port %d enable pending\n", port);
477961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
4780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled\n");
4781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
478261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ErrorPortUnpopulated,
478361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
4784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
478661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_state != OMX_StateInvalid) {
4787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers\n");
4788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
478961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ErrorPortUnpopulated,
479061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
4791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
479361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
479461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if arbitrary bytes*/
479561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!arbitrary_bytes && !input_use_buffer)
479661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPortIndex = buffer - m_inp_mem_ptr;
479761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
479861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPortIndex = buffer - m_inp_heap_ptr;
4799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d \n", nPortIndex);
480161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nPortIndex < drv_ctx.ip_buf.actualcount) {
480261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Clear the bit associated with it.
480361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
480461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
480561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (input_use_buffer == true) {
480661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
480761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Free pmem Buffer index %d",nPortIndex);
480861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_phdr_pmem_ptr)
480961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
481061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
481161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (arbitrary_bytes) {
481261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_phdr_pmem_ptr)
481361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
481461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else
481561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_input_buffer(nPortIndex,NULL);
481661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
481761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    free_input_buffer(buffer);
4818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
481961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bPopulated = OMX_FALSE;
482061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Free the Buffer Header*/
482161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (release_input_done()) {
482261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\n ALL input buffers are freed/released");
482361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer_header();
482461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
482561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
4826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid\n");
4827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
4828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
483061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
483161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && release_input_done()) {
4832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
4834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandPortDisable,
483561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_INPUT_PORT_INDEX,
483661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
4837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
483861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
4839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // check if the buffer is valid
48406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        nPortIndex = buffer - client_buffers.get_il_buf_hdr();
484161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nPortIndex < drv_ctx.op_buf.actualcount) {
4842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d \n", nPortIndex);
4843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Clear the bit associated with it.
4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
4845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_out_bPopulated = OMX_FALSE;
48466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            client_buffers.free_output_buffer (buffer);
4847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
484861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (release_output_done()) {
484961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_output_buffer_header();
4850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
485161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
4852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid\n");
4853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
4854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
485561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
485661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && release_output_done()) {
4857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it\n");
4858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
485961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE \n");
486061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
48616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_
486261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_enable_android_native_buffers) {
486361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
486461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
486561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
48666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
4867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
486861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortDisable,
486961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_OUTPUT_PORT_INDEX,
487061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
4871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
487261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
4873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadPortIndex;
4874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
487561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((eRet == OMX_ErrorNone) &&
487661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
487761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_done()) {
4878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Send the callback now
4879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
4880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandStateSet, OMX_StateLoaded,
488161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
4882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
4885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
488961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
489061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::EmptyThisBuffer
4891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
489261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
489361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   This routine is used to push the encoded video frames to
489461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   the video decoder.
4895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
489661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
489761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
489961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
490061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went successful.
4901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
490261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
490461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
4905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
490661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
490761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
4908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
490961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
491061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Empty this buffer in Invalid State\n");
491161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
491261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
491461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
491561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:ETB Buffer is NULL");
491661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
491761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
491961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_bEnabled) {
492061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:ETB incorrect state operation, input port is disabled.");
492161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
492261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
492461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
492561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:ETB invalid port in header %lu", buffer->nInputPortIndex);
492661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
492761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
492961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_
493061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (iDivXDrmDecrypt) {
493161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
493261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drmErr != OMX_ErrorNone) {
493361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // this error can be ignored
493461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\nERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
493561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
493661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
493761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif //_ANDROID_
493861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
493961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!latency) {
494061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec_time.stop();
494161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            latency = dec_time.processing_time_us();
494261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec_time.start();
494361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
494461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
494561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
494661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
494761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufferIndex = buffer - m_inp_heap_ptr;
494861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
494961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (input_use_buffer == true) {
495061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nBufferIndex = buffer - m_inp_heap_ptr;
495161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
495261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
495361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
495461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer = &m_inp_mem_ptr[nBufferIndex];
495561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
495661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
495761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
495861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nBufferIndex = buffer - m_inp_mem_ptr;
495961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
496061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
496161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
496261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nBufferIndex > drv_ctx.ip_buf.actualcount ) {
496361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:ETB nBufferIndex is invalid");
496461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
496561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
496661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
496761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
496861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
496961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
497061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned)hComp,(unsigned)buffer,
497161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
497261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
497361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
497461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            set_frame_rate(buffer->nTimeStamp);
497561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
497661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
497861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
497961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
498061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/* ======================================================================
498161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
498261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::empty_this_buffer_proxy
498361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
498461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
498561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   This routine is used to push the encoded video frames to
498661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   the video decoder.
498761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
498861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
498961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
499061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
499161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
499261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went successful.
499361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
499461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
499561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
499661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
499761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
499861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int push_cnt = 0,i=0;
499961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned nPortIndex = 0;
500061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
500161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_input_frameinfo frameinfo;
500261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_bufferpayload *temp_buffer;
500361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_seqheader seq_header;
500461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool port_setting_changed = true;
500561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool not_coded_vop = false;
500661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
500761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Should we generate a Aync error event*/
500861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
500961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy is invalid");
501061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
501161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
501261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
501361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
501461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
501561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nPortIndex > drv_ctx.ip_buf.actualcount) {
501661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
501761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPortIndex);
501861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
501961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
502061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
502161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_input_buffers++;
502261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
502361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return zero length and not an EOS buffer */
502461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
502561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
502661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n return zero legth buffer");
502761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
502861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EBD);
502961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
503061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
503361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX) {
503461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        mp4StreamType psBits;
503561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
503661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psBits.numBytes = buffer->nFilledLen;
503761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        mp4_headerparser.parseHeader(&psBits);
503861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        not_coded_vop = mp4_headerparser.is_notcodec_vop(
503961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
504061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (not_coded_vop) {
504161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("\n Found Not coded vop len %lu frame number %u",
504261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buffer->nFilledLen,frame_count);
504361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
504461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\n Eos and Not coded Vop set len to zero");
504561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                not_coded_vop = false;
504661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer->nFilledLen = 0;
504761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
5048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
505161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (input_flush_progress == true
5052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
505361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            || not_coded_vop
5054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
505561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan       ) {
505661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Flush in progress return buffer ");
505761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
505861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EBD);
505961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
506061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
506161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
506261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
506361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
506461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) {
506561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
506661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
506761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
506861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
506961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*for use buffer we need to memcpy the data*/
507061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp_buffer->buffer_len = buffer->nFilledLen;
507161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
507261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (input_use_buffer) {
507361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFilledLen <= temp_buffer->buffer_len) {
507461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (arbitrary_bytes) {
507561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
507661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
507761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
507861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nFilledLen);
507961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
508061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
508161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
508261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
508361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
508461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
508561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
508661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.bufferaddr = temp_buffer->bufferaddr;
508761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.client_data = (void *) buffer;
508861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.datalen = temp_buffer->buffer_len;
508961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.flags = 0;
509061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.offset = buffer->nOffset;
509161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.pmem_fd = temp_buffer->pmem_fd;
509261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.pmem_offset = temp_buffer->offset;
509361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.timestamp = buffer->nTimeStamp;
509461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
509561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("ETB: dmx enabled");
509661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_demux_entries == 0) {
509761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extract_demux_addr_offsets(buffer);
509861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
509961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
510061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
510161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        handle_demux_data(buffer);
510261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
510361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
510461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
510561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_addr = NULL;
510661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_size = 0;
510761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
510861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes) {
510961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= buffer->nFlags;
5110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
511361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
511461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (arbitrary_bytes) {
511561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
511661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_timestamp_list.insert_ts(buffer->nTimeStamp);
511761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
511861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
511961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_timestamp_list.insert_ts(buffer->nTimeStamp);
512061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
512161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
512561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (inputBufferFile1) {
512661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fwrite((const char *)temp_buffer->bufferaddr,
512761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                temp_buffer->buffer_len,1,inputBufferFile1);
512861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
513161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
513261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
513361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
513461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
513561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
513661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
513761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Rxd i/p EOS, Notify Driver that EOS has been reached");
513861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
513961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_scratch.nFilledLen = 0;
514061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_count = 0;
514161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
514261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_count = 0;
514361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils)
514461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils->initialize_frame_checking_environment();
514561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.flush();
514661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_ts = LLONG_MAX;
514761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_flags = 0;
514861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
514961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_entries = 0;
515061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
515161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
515261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane;
515361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&buf, 0, sizeof(buf));
515461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&plane, 0, sizeof(plane));
515561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
515661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long  print_count;
515761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
515861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.flags = V4L2_BUF_FLAG_EOS;
515961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n  INPUT EOS reached \n") ;
516061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
516161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
516261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = nPortIndex;
516361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
516461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
516561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.bytesused = temp_buffer->buffer_len;
516661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.length = drv_ctx.ip_buf.buffer_size;
516761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
516861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)temp_buffer->offset;
516961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[0] = temp_buffer->pmem_fd;
517061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[1] = temp_buffer->offset;
517161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.data_offset = 0;
517261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = &plane;
517361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = 1;
517461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (frameinfo.timestamp >= LLONG_MAX) {
517561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
517661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
517761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //assumption is that timestamp is in milliseconds
517861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
517961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
518061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
518161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
518261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
518361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
518461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver\n");
518561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorHardware;
518661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
518761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!streaming[OUTPUT_PORT]) {
518861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enum v4l2_buf_type buf_type;
518961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int ret,r;
519061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
519161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
5192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
519361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
519461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!ret) {
519561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful \n");
519661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            streaming[OUTPUT_PORT] = true;
519761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
519861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
519961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR(" \n Failed to call streamon on OUTPUT \n");
520061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
520161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
520261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EBD);
520361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
520461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
520561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
520661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
520761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
520861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    time_stamp_dts.insert_timestamp(buffer);
5209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
521061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
5211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
521461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
521561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::FillThisBuffer
5216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
521761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
521861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL client uses this method to release the frame buffer
521961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   after displaying them.
5220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
522161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
522261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
522461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
522561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
522761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
522961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
523261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
523361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("FTB in Invalid State\n");
523461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
523561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
523661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
523761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_bEnabled) {
523861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:FTB incorrect state operation, output port is disabled.");
523961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
524061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
524161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
524261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL ||
524361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount)) {
524461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
524561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
524661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
524761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
524861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex);
524961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
525061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
525161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
525261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
525361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg);
525461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
525761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
525861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::fill_this_buffer_proxy
5259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
526061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
526161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL client uses this method to release the frame buffer
526261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   after displaying them.
5263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
526461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
526561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
526761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
526861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
527061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
527261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE        hComp,
527361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
5274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
527561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE nRet = OMX_ErrorNone;
527661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
527761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned nPortIndex = 0;
527861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_fillbuffer_cmd fillbuffer;
527961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
528061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
528161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
528261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
528361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
528461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount)
528561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
528661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
528761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
528861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufferAdd, bufferAdd->pBuffer);
528961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Return back the output buffer to client*/
529061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) {
529161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Output Buffers return flush/disable condition");
529261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
529361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.FillBufferDone (hComp,m_app_data,buffer);
529461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
529561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
529661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers++;
529761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
529861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
529961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ptr_respbuffer) {
530061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
530161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
530261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
530361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
530461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
530561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
530661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.FillBufferDone (hComp,m_app_data,buffer);
530761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pending_output_buffers--;
530861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
530961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
531061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
531161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
531261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
531361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
531461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&buf, 0, sizeof(buf));
531561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
531661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
531761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
531861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = nPortIndex;
531961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
532061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
532161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].bytesused = buffer->nFilledLen;
532261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].length = drv_ctx.op_buf.buffer_size;
532361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].m.userptr =
532461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
532561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
532661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
532761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
532861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].data_offset = 0;
532961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
533061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
533161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].bytesused = 0;
533261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
533361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
53346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
533561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
53366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
533761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
533861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].data_offset = 0;
533961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra_idx >= VIDEO_MAX_PLANES) {
534061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
534161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
534261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
534361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = plane;
534461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = drv_ctx.num_planes;
534561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
534661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
534761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
534861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf to driver");
534961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
535061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
535461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
535561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SetCallbacks
5356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
535761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
535861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Set the callbacks.
5359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
536061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
536161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
536361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
536461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
5365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
536661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
536861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_CALLBACKTYPE* callbacks,
536961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR             appData)
5370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
537261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_cb       = *callbacks;
537361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
537461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EventHandler,m_cb.FillBufferDone);
537561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_app_data =    appData;
537661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
5377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
538061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
538161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentDeInit
5382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
538361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
538461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Destroys the component and release memory allocated to the heap.
5385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
538661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
538761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
538961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
539061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
5391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
539261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
5394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
539661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (iDivXDrmDecrypt) {
5397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete iDivXDrmDecrypt;
5398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        iDivXDrmDecrypt=NULL;
5399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
54026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    unsigned i = 0;
540361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_StateLoaded != m_state) {
5404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d\n",\
540561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state);
5406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nPlayback Ended - FAILED");
540761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
540861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Playback Ended - PASSED");
5409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the output buffers have to be cleaned up*/
541261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
5413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("Freeing the Output Memory\n");
541461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) {
541561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_output_buffer (&m_out_mem_ptr[i]);
5416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
541761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ICS_
541861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
541961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
5420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the input buffers have to be cleaned up*/
542361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr || m_inp_heap_ptr) {
5424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("Freeing the Input Memory\n");
542561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) {
542661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_inp_mem_ptr)
542761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer (i,&m_inp_mem_ptr[i]);
542861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else
542961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer (i,NULL);
5430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer_header();
5433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_output_buffer_header();
543461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer) {
5435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(h264_scratch.pBuffer);
5436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.pBuffer = NULL;
5437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
543961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_parser) {
5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete h264_parser;
544161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_parser = NULL;
5442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
544461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_platform_list) {
5445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_platform_list);
5446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_platform_list = NULL;
5447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
544861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_vendor_config.pData) {
5449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_vendor_config.pData);
5450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_vendor_config.pData = NULL;
5451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Reset counters in mesg queues
5454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_size=0;
5455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_size=0;
5456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_size=0;
5457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_read = m_ftb_q.m_write =0;
5458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_read = m_cmd_q.m_write =0;
5459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_read = m_etb_q.m_write =0;
5460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
546161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
546261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_timestamp_list.reset_ts_list();
5463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
5467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
546861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // NULL);
5469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Close the driver instance");
54706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
5471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
5472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (inputBufferFile1);
5473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
54756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    if (outputBufferFile1)
547661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fclose (outputBufferFile1);
5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
5479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputExtradataFile);
5480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
548161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\n omx_vdec::component_deinit() complete");
548261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
548661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
548761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseEGLImage
5488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
548961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
549061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use EGL Image method implementation <TBD>.
5491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
549261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
549361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
549561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
549661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Not Implemented error.
5497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
549861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
550061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
550161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
550261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                     appData,
550361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN void*                      eglImage)
5504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
550561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
550661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
550761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
5508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
551061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
551161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    EGLint fd = -1, offset = 0,pmemPtr = 0;
5512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
551361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fd = -1, offset = 0;
5514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
551561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nuse EGL image support for decoder");
551661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
551761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n ");
551861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
552061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_display_id == NULL) {
5521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Display ID is not set by IL client \n");
5522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
552361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
552461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
552561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eglGetProcAddress("eglQueryImageKHR");
552661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
552761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
552861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
5529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app
5530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl {
5531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int pmem_fd;
5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int offset;
5533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    };
5534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl *temp_egl_id = NULL;
5535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    void * pmemPtr = (void *) eglImage;
5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    temp_egl_id = (struct temp_egl *)eglImage;
553761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_egl_id != NULL) {
5538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fd = temp_egl_id->pmem_fd;
5539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        offset = temp_egl_id->offset;
5540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (fd < 0) {
5543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d  \n",fd);
5544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
554561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
554661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_info.pmem_fd = (OMX_U32) fd;
554761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_info.offset = (OMX_U32) offset;
554861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_entry.entry = (void *) &pmem_info;
554961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
555061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_list.entryList = &pmem_entry;
555161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_list.nEntries = 1;
555261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers = true;
555361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
555461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
555561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (OMX_U8 *)pmemPtr)) {
555661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("use buffer call failed for egl image\n");
555761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
555861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
555961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
556361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
556461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentRoleEnum
5565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
556661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
556761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Component Role Enum method implementation.
5568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
556961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
557061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
557261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
557361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything is successful.
557461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
557661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_U8*        role,
557761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32        index)
5578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
557961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
5580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
558161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
558261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
558361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
558461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
558561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
558661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
558761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
558961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
559061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
559161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
559261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
559361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
559461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
559561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
559661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
559761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
559861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
559961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
560061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
560161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n No more roles \n");
560261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
560361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
560661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
560761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) ) {
560861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
560961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
561061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
561161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
561261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n No more roles \n");
561361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
561461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
561561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
561661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
561761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
561861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
561961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
562061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n No more roles \n");
562161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
562261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
562361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
562461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
562561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
562661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
562761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
562861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n No more roles \n");
562961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
563061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
563161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
563261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
563361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ) {
563461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
563561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
563661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
563761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
563861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n No more roles \n");
563961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
564061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
564161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
564261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
564361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
564461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s\n",role);
564561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
564661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n No more roles \n");
564761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
564861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
564961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
565061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:Querying Role on Unknown Component\n");
565161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInvalidComponentName;
56526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
565361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
5654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
566061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
566161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateDone
5662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
566361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
566461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if entire buffer pool is allocated by IL Client or not.
566561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Need this to move to IDLE state.
5666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
566761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
566861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
567061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
567161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
5672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
567361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void)
5675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
567661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
567761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet_In = false;
567861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet_Out = false;
5679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
568061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet_In = allocate_input_done();
568161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet_Out = allocate_output_done();
5682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
568361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bRet_In && bRet_Out) {
568461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
568561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
568761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
569061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
569161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateInputDone
5692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
569461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if I/P buffer pool is allocated by IL Client or not.
5695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
569761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
570061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
5701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
570261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void)
5704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
570561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
570661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0;
570761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
570861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr == NULL) {
570961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bRet;
571061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
571161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr ) {
571261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; i<drv_ctx.ip_buf.actualcount; i++) {
571361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
571461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
571561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
571661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
571761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
571861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i == drv_ctx.ip_buf.actualcount) {
571961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
572061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
572161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
572261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
572361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_bPopulated = OMX_TRUE;
572461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
572561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
572861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
572961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateOutputDone
5730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
573161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
573261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if entire O/P buffer pool is allocated by IL Client or not.
5733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
573461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
573561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
573761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
573861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
5739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
574061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void)
5742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
574361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
574461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned j=0;
574561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
574661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr == NULL) {
574761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bRet;
574861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
574961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
575061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
575161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j < drv_ctx.op_buf.actualcount; j++) {
575261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_out_bm_count,j)) {
575361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
575461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
575561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
575661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
575761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
575861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (j == drv_ctx.op_buf.actualcount) {
575961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
576061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
576161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_bEnabled)
576261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bPopulated = OMX_TRUE;
576361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
576561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
576961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
577061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseDone
5771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
577261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
577361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
5774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
577561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
577661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
577861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
577961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
578161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void)
5783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
578461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
5785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
578661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (release_input_done()) {
578761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_output_done()) {
578861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
578961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
579161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
579661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
579761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseOutputDone
5798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
579961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
580061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
5801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
580261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
580361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
580561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
580661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
580861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void)
5810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
581161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
581261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0,j=0;
581361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
581461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Value of m_out_mem_ptr %p",m_inp_mem_ptr);
581561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
581661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j < drv_ctx.op_buf.actualcount ; j++) {
581761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_out_bm_count,j)) {
581861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
581961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
582061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
582161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (j == drv_ctx.op_buf.actualcount) {
582261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bm_count = 0;
582361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
582461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
582561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
582661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_bm_count = 0;
582761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
582861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
582961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
583261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
583361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseInputDone
5834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
583561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
583661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
5837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
583861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
583961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
584161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
584261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
584461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void)
5846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
584761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
584861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0,j=0;
584961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
585061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
585161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr) {
585261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j<drv_ctx.ip_buf.actualcount; j++) {
585361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
585461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
585561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
585661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
585761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (j==drv_ctx.ip_buf.actualcount) {
585861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
585961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
586061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
586161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
586261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
586361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
586761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE * buffer)
5868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
586961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
587061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) {
587161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n [FBD] ERROR in ptr(%p)", buffer);
587261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
587361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (output_flush_progress) {
587461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
587561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
587661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nTimeStamp = 0;
587761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
587861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
587961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
588061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
588261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
588361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer, buffer->pBuffer);
588461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers --;
5885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
588661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
588761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Output EOS has been reached");
588861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!output_flush_progress)
588961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event((unsigned)NULL, (unsigned)NULL,
589061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EOS_DONE);
5891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
589261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame) {
589361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
589461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
589561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
589661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame) {
589761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFilledLen = 0;
589861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL,
589961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL);
590061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = NULL;
590161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
590261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
590361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
590461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
590561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_BUFFER_LOG
590661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (outputBufferFile1 && buffer->nFilledLen) {
590761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int buf_index = buffer - m_out_mem_ptr;
590861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int stride = drv_ctx.video_resolution.stride;
590961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int scanlines = drv_ctx.video_resolution.scan_lines;
591061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
591161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int i;
591261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int bytes_written = 0;
591361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
591461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
591561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp += stride;
591661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
591761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
591861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int stride_c = stride;
591961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
592061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
592161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp += stride_c;
592261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
592361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
592561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
592661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* For use buffer we need to copy the data */
592761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!output_flush_progress) {
592861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.get_next_timestamp(buffer,
592961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
593061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ?true:false);
593161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_debug_timestamp) {
593261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
593361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_TICKS expected_ts = 0;
593461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_timestamp_list.pop_min_ts(expected_ts);
593561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
593661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nTimeStamp, expected_ts);
593761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
593861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (buffer->nTimeStamp != expected_ts) {
593961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\n ERROR in omx_vdec::async_message_process timestamp Check");
594061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
594161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
594261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
594461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_cb.FillBufferDone) {
594561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFilledLen > 0) {
594661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            handle_extradata(buffer);
594761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (client_extradata & OMX_TIMEINFO_EXTRADATA)
594861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep min timestamp interval to handle corrupted bit stream scenario
594961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                set_frame_rate(buffer->nTimeStamp);
595061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (arbitrary_bytes)
595161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                adjust_timestamp(buffer->nTimeStamp);
595261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (perf_flag) {
595361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!proc_frms) {
595461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    dec_time.stop();
595561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    latency = dec_time.processing_time_us() - latency;
595661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
595761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    dec_time.start();
595861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fps_metrics.start();
595961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
596061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                proc_frms++;
596161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
596261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_U64 proc_time = 0;
596361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fps_metrics.stop();
596461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    proc_time = fps_metrics.processing_time_us();
596561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
596661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            proc_frms, (float)proc_time / 1e6,
596761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (float)(1e6 * proc_frms) / proc_time);
596861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    proc_frms = 0;
596961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
597061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
597161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
597261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_EXTRADATA_LOG
597361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (outputExtradataFile) {
597461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
597561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
597661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                p_extra = (OMX_OTHER_EXTRADATATYPE *)
597761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((unsigned)(buffer->pBuffer + buffer->nOffset +
597861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nFilledLen + 3)&(~3));
597961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                while (p_extra &&
598061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) {
598161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("\nWRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
598261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
598361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p_extra->eType == OMX_ExtraDataNone) {
598461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
598561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
598661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
598761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
598861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
598961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
599061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
599161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
599261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts = LLONG_MAX;
599361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rst_prev_ts = true;
599461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
599561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
599661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
599761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
599861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             buffer->pPlatformPrivate)->entryList->entry;
599961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
600061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *il_buffer;
600161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        il_buffer = client_buffers.get_il_buf_hdr(buffer);
600261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (il_buffer)
600361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
600461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else {
600561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
600661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
600761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
600861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
600961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
601061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
60116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
6012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
601361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
601761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE* buffer)
6018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
602061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) {
6021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n empty_buffer_done: ERROR bufhdr = %p", buffer);
602261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
602661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer, buffer->pBuffer);
6027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_input_buffers--;
6028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
602961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
603061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame == NULL && input_flush_progress == false) {
603161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Push input from buffer done address of Buffer %p",buffer);
603261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = buffer;
603361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen = 0;
603461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nTimeStamp = LLONG_MAX;
603561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            push_input_buffer (hComp);
603661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
603761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Push buffer into freeq address of Buffer %p",buffer);
603861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen = 0;
603961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_input_free_q.insert_entry((unsigned)buffer,
604061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned)NULL, (unsigned)NULL)) {
604161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\nERROR:i/p free Queue is FULL Error");
604261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
6043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
604461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_cb.EmptyBufferDone) {
6045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nFilledLen = 0;
604661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (input_use_buffer == true) {
6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
6048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
6050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
6052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message)
6055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
605661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec* omx = NULL;
605761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_msginfo *vdec_msg = NULL;
605861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
605961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer *v4l2_buf_ptr = NULL;
606061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_output_frameinfo *output_respbuf = NULL;
606161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc=1;
606261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (context == NULL || message == NULL) {
606361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n FATAL ERROR in omx_vdec::async_message_process NULL Check");
606461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
606561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
606661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    vdec_msg = (struct vdec_msginfo *)message;
606761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
606861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = reinterpret_cast<omx_vdec*>(context);
606961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
607061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (vdec_msg->msgcode) {
607161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
607261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_HW_ERROR:
607361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
607461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
607561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
607661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
607761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_START_DONE:
607861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
607961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_START_DONE);
608061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
608161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
608261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_STOP_DONE:
608361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
608461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_STOP_DONE);
608561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
608661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
608761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_RESUME_DONE:
608861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
608961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_RESUME_DONE);
609061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
609161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
609261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_PAUSE_DONE:
609361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
609461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_PAUSE_DONE);
609561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
609661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
609761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
609861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
609961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
610061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
610161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
610261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
610361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
610461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
610561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_INPUT_FLUSHED:
610661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
610761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
610861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* omxhdr = (OMX_BUFFERHEADERTYPE* )
610961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan               vdec_msg->msgdata.input_frame_clientdata; */
611061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
611161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
611261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
611361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (omxhdr == NULL ||
611461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) {
611561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omxhdr = NULL;
611661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg->status_code = VDEC_S_EFATAL;
611761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
611861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
611961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
612061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EBD);
612161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
612261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
612361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int64_t *timestamp;
612461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            timestamp = (int64_t *) malloc(sizeof(int64_t));
612561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (timestamp) {
612661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
612761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
612861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
612961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\nField dropped time stamp is %lld",
613061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        vdec_msg->msgdata.output_frame.time_stamp);
613161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
613261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
613361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_OUTPUT_FLUSHED:
613461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
613561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
613661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
613761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
613861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
613961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
614061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg->msgdata.output_frame.pic_type);
614161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
614261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (omxhdr && omxhdr->pOutputPortPrivate &&
614361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
614461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
614561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) {
614661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen) {
614761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
614861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
614961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
615061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags;
615161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
615261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_EOS) {
615361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
615461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        //rc = -1;
615561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
615661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
615761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
615861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
615961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg->msgdata.output_frame.bufferaddr =
616061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
616161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft !=
616261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    vdec_msg->msgdata.output_frame.framesize.left)
616361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top)
616461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right)
616561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) {
616661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
616761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top;
616861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
616961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
617061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_HIGH("\n Crop information has changed\n");
617161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop,
617261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
617361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
617461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf = (struct vdec_output_frameinfo *)\
617561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     omxhdr->pOutputPortPrivate;
617661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf->len = vdec_msg->msgdata.output_frame.len;
617761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
617861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
617961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_I;
618061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
618161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
618261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_P;
618361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
618461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
618561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_B;
618661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
618761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
618861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (omx->output_use_buffer)
618961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        memcpy ( omxhdr->pBuffer, (void *)
619061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
619161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 (unsigned long)vdec_msg->msgdata.output_frame.offset),
619261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                vdec_msg->msgdata.output_frame.len);
619361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
619461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFilledLen = 0;
619561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
619661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_FBD);
619761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
619861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
619961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EOS_DONE);
620061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else
620161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
620261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
620361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
620461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_CONFIG_CHANGED:
620561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("\n Port settings changed");
620661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
620761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_PORT_RECONFIG);
620861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
620961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
621061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
621161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\n Port settings changed info");
621261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // get_buffer_req and populate port defn structure
621361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ERRORTYPE eRet = OMX_ErrorNone;
621461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_format fmt;
621561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int ret;
621661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
621761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
621861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height);
621961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->drv_ctx.video_resolution.stride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline;
622061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->drv_ctx.video_resolution.scan_lines = fmt.fmt.pix_mp.plane_fmt[0].reserved[0];
622161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->m_port_def.nPortIndex = 1;
622261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = omx->update_portdef(&(omx->m_port_def));
622361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
622461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
622561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
622661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
622761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
622861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
622961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
623061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
6231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
623461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_HANDLETYPE hComp,
623561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *buffer
623661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
6237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
623861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
623961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Empty this arbitrary");
624061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
624161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
624261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
624361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
624461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
624561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
624661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
624761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
624861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return zero length and not an EOS buffer */
624961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return buffer if input flush in progress */
625061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
625161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
625261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n return zero legth buffer or flush in progress");
625361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
625461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
625561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
625661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
625761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (psource_frame == NULL) {
625861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
625961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = buffer;
626061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Try to Push One Input Buffer ");
626161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        push_input_buffer (hComp);
626261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
626361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Push the source buffer into pendingq %p",buffer);
626461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL,
626561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL)) {
626661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
626761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
626861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
626961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
627061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
6272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
6275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
627661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
627761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
627861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
627961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pdest_frame == NULL || psource_frame == NULL) {
628061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if we have a destination buffer*/
628161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame == NULL) {
628261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Get a Destination buffer from the queue");
628361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_free_q.m_size) {
628461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_free_q.pop_entry(&address,&p2,&id);
628561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
628661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen = 0;
628761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = LLONG_MAX;
628861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Address of Pmem Buffer %p",pdest_frame);
628961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
629061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
629161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
629261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if we have a destination buffer*/
629361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame == NULL) {
629461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Get a source buffer from the queue");
629561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_pending_q.m_size) {
629661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_pending_q.pop_entry(&address,&p2,&id);
629761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame = (OMX_BUFFERHEADERTYPE *)address;
629861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
629961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nTimeStamp);
630061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
630161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nFlags,psource_frame->nFilledLen);
630261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
630361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
630461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
630561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
630661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
630761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
630861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while ((pdest_frame != NULL) && (psource_frame != NULL)) {
630961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_type_parse) {
631061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_MPEG4:
631161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_H263:
631261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_MPEG2:
631361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret =  push_input_sc_codec(hComp);
631461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
631561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_H264:
631661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_h264(hComp);
631761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
631861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_HEVC:
631961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_hevc(hComp);
632061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
632161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_VC1:
632261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_vc1(hComp);
632361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
632461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
632561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
632661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
632761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret != OMX_ErrorNone) {
632861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Pushing input Buffer Failed");
632961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx_report_error ();
633061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
633161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
633261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
633361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
633461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
6335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
6338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
633961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
634061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
634161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
6342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
634361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Start Parsing the bit stream address %p TimeStamp %d",
634461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame,psource_frame->nTimeStamp);
634561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_frame_parser.parse_sc_frame(psource_frame,
634661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame,&partial_frame) == -1) {
634761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
634861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
635061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
635161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
635261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Frame size %d source %p frame count %d",
635361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen,psource_frame,frame_count);
635461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
635561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
635661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n TimeStamp updated %d",pdest_frame->nTimeStamp);
635761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*First Parsed buffer will have only header Hence skip*/
635861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (frame_count == 0) {
635961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n H263/MPEG4 Codec First Frame ");
636061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
636161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (codec_type_parse == CODEC_TYPE_MPEG4 ||
636261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    codec_type_parse == CODEC_TYPE_DIVX) {
636361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mp4StreamType psBits;
636461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
636561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psBits.numBytes = pdest_frame->nFilledLen;
636661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mp4_headerparser.parseHeader(&psBits);
636761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
636861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
636961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_count++;
637061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
637161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
637261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame->nFilledLen) {
637361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
637461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
637561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
637661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
637761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
637861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
637961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
638061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_input_free_q.m_size) {
638161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_input_free_q.pop_entry(&address,&p2,&id);
638261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
638361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen = 0;
638461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
638561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
638661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\nZero len buffer return back to POOL");
638761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL,
638861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned)NULL);
638961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
639061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
639161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
639261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
639361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Not a Complete Frame %d",pdest_frame->nFilledLen);
639461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
639561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame->nAllocLen ==
639661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen + pdest_frame->nOffset) {
639761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\nERROR:Frame Not found though Destination Filled");
639861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
639961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
640061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
640161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
640261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (psource_frame->nFilledLen == 0) {
640361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
640461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
640561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags |= psource_frame->nFlags;
640661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
640761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
640861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
640961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,frame_count++);
641061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
641161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
641261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
641361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
641461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
641561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
641661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
641761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Last frame in else dest addr") ;
641861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
641961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
642061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
642161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (generate_ebd) {
642261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Buffer Consumed return back to client %p",psource_frame);
642361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
642461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
642561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
642661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_pending_q.m_size) {
642761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
642861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_pending_q.pop_entry(&address,&p2,&id);
642961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame = (OMX_BUFFERHEADERTYPE *) address;
643061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Next source Buffer %p time stamp %d",psource_frame,
643161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nTimeStamp);
643261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Next source Buffer flag %d length %d",
643361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nFlags,psource_frame->nFilledLen);
643461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
643561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
643661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
643761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
6441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
644261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
644361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
644461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL isNewFrame = OMX_FALSE;
644561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
644661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
644761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer == NULL) {
644861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:H.264 Scratch Buffer not allocated");
644961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
645161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Pending h264_scratch.nFilledLen %d "
645261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
645361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
645461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.nFilledLen && look_ahead_nal) {
645561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
645661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
645761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen) {
6458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
6459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
6460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
646161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Copy the previous NAL (h264 scratch) into Dest frame");
6462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_scratch.nFilledLen = 0;
646361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
646461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Error:1: Destination buffer overflow for H264");
6465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
6466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
646761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
646861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nal_length == 0) {
646961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Zero NAL, hence parse using start code");
647061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_sc_frame(psource_frame,
647161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
647261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
6473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
6474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
647561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
647661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
647761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_h264_nallength(psource_frame,
647861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
647961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
648061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
6481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
648261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
6483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
648461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
648561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
648661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
648761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_count++;
648861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
648961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFlags = psource_frame->nFlags;
649061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
649161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen);
649261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.nFilledLen) {
649361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
649461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        NALU_TYPE_SPS);
6495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
649661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (client_extradata & OMX_TIMEINFO_EXTRADATA)
649761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
649861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
649961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
650061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // If timeinfo is present frame info from SEI is already processed
650161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
650261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
650361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
650461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
650561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_count++;
650661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
650761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nTimeStamp = h264_last_au_ts;
650861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFlags = h264_last_au_flags;
650961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef PANSCAN_HDLR
651061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
651161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_parser->update_panscan_data(h264_last_au_ts);
651261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
651361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
651461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
651561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
651661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_ts = h264_scratch.nTimeStamp;
651761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_flags = h264_scratch.nFlags;
651861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
651961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
652061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
652161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!VALID_TS(h264_last_au_ts))
652261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_last_au_ts = ts_in_sei;
652361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
652461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
652561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
652661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_ts = LLONG_MAX;
652761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
652861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
652961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!isNewFrame) {
653061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
653161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen) {
653261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("\n Not a NewFrame Copy into Dest len %d",
653361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen);
653461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
653561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
653661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
653761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
653861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
653961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.nFilledLen = 0;
654061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
654161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("\n Error:2: Destination buffer overflow for H264");
654261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
654361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
654461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
654561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                look_ahead_nal = true;
654661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Frame Found start Decoding Size =%d TimeStamp = %x",
654761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
654861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Found a frame size = %d number = %d",
654961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,frame_count++);
655061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
655161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pdest_frame->nFilledLen == 0) {
655261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("\n Copy the Current Frame since and push it");
655361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    look_ahead_nal = false;
655461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
655561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen) {
655661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
655761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                h264_scratch.pBuffer,h264_scratch.nFilledLen);
655861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
655961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen = 0;
656061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
656161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n Error:3: Destination buffer overflow for H264");
656261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
656361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
656461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
656561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
656661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("\n Reset the EOS Flag");
656761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
656861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
656961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    /*Push the frame to the Decoder*/
657061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
657161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
657261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
657361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    //frame_count++;
657461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = NULL;
657561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_input_free_q.m_size) {
657661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_input_free_q.pop_entry(&address,&p2,&id);
657761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
657861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("\n Pop the next pdest_buffer %p",pdest_frame);
657961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen = 0;
658061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags = 0;
658161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = LLONG_MAX;
658261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
658361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
658461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
658561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
658661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
658761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
658861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
658961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (h264_scratch.nAllocLen ==
659061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen + h264_scratch.nOffset) {
659161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
659261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
6593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
659461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
659561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
659661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!psource_frame->nFilledLen) {
659761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Buffer Consumed return source %p back to client",psource_frame);
659861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
659961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
660061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
660161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n EOS Reached Pass Last Buffer");
660261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
660361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen) {
660461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
660561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
660661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
660761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.nFilledLen = 0;
660861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
660961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR:4: Destination buffer overflow for H264");
661061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
661161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
661261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
661361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
661461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
661561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n pdest_frame->nFilledLen =%d TimeStamp = %x",
661661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
661761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Push AU frame number %d to driver", frame_count++);
661861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
661961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
662061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
662161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!VALID_TS(pdest_frame->nTimeStamp))
662261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = ts_in_sei;
662361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
6624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
662561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
662661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
662761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
662861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
662961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
663061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
663161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
663261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d",
663361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame,h264_scratch.nFilledLen);
663461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
663561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
663661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
663761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
663861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (generate_ebd && !psource_frame->nFilledLen) {
663961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
664061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = NULL;
664161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_input_pending_q.m_size) {
664261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Pull Next source Buffer %p",psource_frame);
664361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&address,&p2,&id);
664461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
664561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\nNext source Buffer flag %d src length %d",
664661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    psource_frame->nFlags,psource_frame->nFilledLen);
664761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
664861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
664961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
66526eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc)
6653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
66546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_ERRORTYPE rc = OMX_ErrorNone;
665561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) {
66566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        memcpy ((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen);
665761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pDst->nTimeStamp == LLONG_MAX || pDst->nTimeStamp == 0) {
66586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            pDst->nTimeStamp = pSrc->nTimeStamp;
66596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            DEBUG_PRINT_LOW("Assign Dst nTimeStamp=%lld", pDst->nTimeStamp);
6660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
66616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        pDst->nFilledLen += pSrc->nFilledLen;
66626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        pSrc->nFilledLen = 0;
666361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
66646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        DEBUG_PRINT_ERROR("Error: Destination buffer overflow\n");
66656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        rc = OMX_ErrorBadParameter;
6666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
66676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return rc;
6668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
66706eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_hevc (OMX_HANDLETYPE hComp)
6671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
667261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
667361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
667461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL isNewFrame = OMX_FALSE;
667561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
667661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE rc = OMX_ErrorNone;
667761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
667861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer == NULL) {
667961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:Hevc Scratch Buffer not allocated");
668061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
66816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
668261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
668361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
668461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("h264_scratch.nFilledLen %d has look_ahead_nal %d pdest_frame nFilledLen %d nTimeStamp %lld\n",
668561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFilledLen, look_ahead_nal, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
668661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
668761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.nFilledLen && look_ahead_nal) {
668861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
668961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
669061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // copy the lookahead buffer in the scratch
66916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        rc = copy_buffer(pdest_frame, &h264_scratch);
669261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc != OMX_ErrorNone) {
669361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc;
669461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
669561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
669661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nal_length == 0) {
669761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_sc_frame(psource_frame,
669861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
669961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Error In Parsing Return Error");
67006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            return OMX_ErrorBadParameter;
67016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
670261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
670361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d\n",nal_length);
670461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_h264_nallength(psource_frame,
670561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
670661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Error In Parsing NAL size, Return Error");
67076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            return OMX_ErrorBadParameter;
670861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
670961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
671061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
671161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
671261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
671361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n First NAL with Zero Length, hence Skip");
671461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_count++;
671561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
671661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFlags = psource_frame->nFlags;
671761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
671861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Parsed New NAL Length = %d",h264_scratch.nFilledLen);
671961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.nFilledLen) {
672061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mHEVCutils.isNewFrame(&h264_scratch, 0, isNewFrame);
672161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_count++;
672261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
672361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
672461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!isNewFrame) {
672561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %d nTimestamp %lld, pdest_frame nFilledLen %d nTimestamp %lld\n",
672661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen, h264_scratch.nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
672761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc = copy_buffer(pdest_frame, &h264_scratch);
672861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( rc != OMX_ErrorNone) {
672961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return rc;
673061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
673161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
673261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                look_ahead_nal = true;
673361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pdest_frame->nFilledLen == 0) {
673461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    look_ahead_nal = false;
673561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer\n");
673661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    rc = copy_buffer(pdest_frame, &h264_scratch);
673761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( rc != OMX_ErrorNone ) {
673861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
673961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
674061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
674161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
674261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
674361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
674461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
674561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("FrameDetecetd # %d pdest_frame nFilledLen %d nTimeStamp %lld, look_ahead_nal in h264_scratch nFilledLen %d nTimeStamp %lld \n",
674661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            frame_count++, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
674761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
674861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
674961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
675061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = NULL;
675161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_input_free_q.m_size) {
675261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_input_free_q.pop_entry(&address,&p2,&id);
675361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
675461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("pop the next pdest_buffer %p\n",pdest_frame);
675561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen = 0;
675661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags = 0;
675761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = LLONG_MAX;
675861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
675961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
676061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
676161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
676261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
676361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %d nTimeStamp %lld, pdest_frame nFilledLen %d nTimeStamp %lld, h264_scratch nFilledLen %d nTimeStamp %lld \n",
676461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame->nFilledLen, psource_frame->nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
676561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
676661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
676761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (h264_scratch.nAllocLen ==
676861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen + h264_scratch.nOffset) {
676961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\nERROR: Frame Not found though Destination Filled");
677061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
677161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
677261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
677361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
677461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!psource_frame->nFilledLen) {
677561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client\n",psource_frame);
677661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
677761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
677861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
677961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer\n");
678061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc = copy_buffer(pdest_frame, &h264_scratch);
678161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( rc != OMX_ErrorNone ) {
678261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return rc;
678361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
678461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
678561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
678661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
678761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%d TimeStamp = %lld\n",
678861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frame_count, pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
678961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
679061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
679161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
679261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
679361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
679461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
679561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
679661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
679761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Last frame in else dest addr %p size %d",
679861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame,h264_scratch.nFilledLen);
679961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
680061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
680161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
680261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
680361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (generate_ebd && !psource_frame->nFilledLen) {
680461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
680561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = NULL;
680661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_input_pending_q.m_size) {
680761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&address,&p2,&id);
680861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
680961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Next source Buffer flag %d nFilledLen %d, nTimeStamp %lld\n",
681061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    psource_frame->nFlags,psource_frame->nFilledLen, psource_frame->nTimeStamp);
681161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
681261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
681361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
68146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
68156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
68166eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
68176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
68186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_U8 *buf, *pdest;
68196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_U32 partial_frame = 1;
68206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_U32 buf_len, dest_len;
68216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
682261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (first_frame == 0) {
68236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        first_frame = 1;
68246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        DEBUG_PRINT_LOW("\nFirst i/p buffer for VC1 arbitrary bytes\n");
682561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_vendor_config.pData) {
68266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            DEBUG_PRINT_LOW("\nCheck profile type in 1st source buffer\n");
68276eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            buf = psource_frame->pBuffer;
68286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            buf_len = psource_frame->nFilledLen;
68296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
68306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
683161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    VC1_SP_MP_START_CODE) {
68326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                m_vc1_profile = VC1_SP_MP_RCV;
683361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
68346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                m_vc1_profile = VC1_AP;
683561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
68366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                DEBUG_PRINT_ERROR("\nInvalid sequence layer in first buffer\n");
68376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                return OMX_ErrorStreamCorrupt;
68386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
683961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
68406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
68416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                pdest_frame->nOffset;
68426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
684361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nOffset);
68446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
684561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (dest_len < m_vendor_config.nDataSize) {
68466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                DEBUG_PRINT_ERROR("\nDestination buffer full\n");
68476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                return OMX_ErrorBadParameter;
684861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
68496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
68506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
68516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
68526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
68536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
68546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
685561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (m_vc1_profile) {
68566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        case VC1_AP:
68576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            DEBUG_PRINT_LOW("\n VC1 AP, hence parse using frame start code");
685861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
68596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                DEBUG_PRINT_ERROR("\n Error In Parsing VC1 AP start code");
68606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                return OMX_ErrorBadParameter;
68616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
686261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
68636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
68646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        case VC1_SP_MP_RCV:
68656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        default:
68666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            DEBUG_PRINT_ERROR("\n Unsupported VC1 profile in ArbitraryBytes Mode\n");
68676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            return OMX_ErrorBadParameter;
68686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
68696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return OMX_ErrorNone;
68706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
68716eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
687261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef USE_ION
687361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
687461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 alignment)
687561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
687661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem_allocation allocation;
687761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.size = buffer_size;
687861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.align = clip2(alignment);
687961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocation.align < 4096) {
688061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocation.align = 4096;
688161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
688261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
688361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
688461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                allocation.align, allocation.size);
688561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
688661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
688761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
688861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
688961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
689061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
68926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
689361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 alignment, struct ion_allocation_data *alloc_data,
689461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct ion_fd_data *fd_data, int flag)
68956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
689661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fd = -EINVAL;
689761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = -EINVAL;
689861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ion_dev_flag;
689961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_ion ion_buf_info;
690061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!alloc_data || buffer_size <= 0 || !fd_data) {
690161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory\n");
690261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -EINVAL;
690361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
690461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ion_dev_flag = O_RDONLY;
690561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fd = open (MEM_DEVICE, ion_dev_flag);
690661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
690761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("opening ion device failed with fd = %d\n", fd);
690861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return fd;
690961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
691061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->flags = 0;
691161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!secure_mode && (flag & ION_FLAG_CACHED)) {
691261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->flags |= ION_FLAG_CACHED;
691361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
691461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->len = buffer_size;
691561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->align = clip2(alignment);
691661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (alloc_data->align < 4096) {
691761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->align = 4096;
691861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
691961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((secure_mode) && (flag & ION_SECURE))
692061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->flags |= ION_SECURE;
692161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
692261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_
692361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->heap_mask = ION_HEAP(ION_ADSP_HEAP_ID);
692461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else
692561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->heap_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
692661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
692761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (secure_mode) {
692861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->heap_mask = ION_HEAP(MEM_HEAP_ID);
692961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
693061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
693161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc || !alloc_data->handle) {
693261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
693361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->handle = NULL;
693461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(fd);
693561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd = -ENOMEM;
693661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return fd;
693761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
693861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fd_data->handle = alloc_data->handle;
693961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(fd,ION_IOC_MAP,fd_data);
694061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
694161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n ION MAP failed ");
694261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.ion_alloc_data = *alloc_data;
694361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.ion_device_fd = fd;
694461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.fd_ion_data = *fd_data;
694561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_ion_memory(&ion_buf_info);
694661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd_data->fd =-1;
694761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(fd);
694861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd = -ENOMEM;
694961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
695061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return fd;
6952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
695461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
6955dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
695661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
695761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!buf_ion_info) {
695861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n ION: free called with invalid fd/allocdata");
695961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
696061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
696161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
696261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &buf_ion_info->ion_alloc_data.handle)) {
696361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n ION: free failed" );
696461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
696561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    close(buf_ion_info->ion_device_fd);
696661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->ion_device_fd = -1;
696761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->ion_alloc_data.handle = NULL;
696861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->fd_ion_data.fd = -1;
6969dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
6970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header()
6972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
697361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\n ALL output buffers are freed/released");
697461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_use_buffer = false;
697561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers = false;
697661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
697761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
697861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (m_out_mem_ptr);
697961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = NULL;
698061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
698161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
698261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_platform_list) {
698361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(m_platform_list);
698461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_platform_list = NULL;
698561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
698661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
698761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_respbuffer) {
698861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_respbuffer);
698961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = NULL;
699061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
699161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_outputbuffer) {
699261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_outputbuffer);
699361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = NULL;
699461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
6995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
6996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
6997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free o/p ion context");
699861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(drv_ctx.op_buf_ion_info);
6999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
7000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header()
7005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = false;
700761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
700861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils) {
700961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Free utils parser");
701061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            delete (m_frame_parser.mutils);
701161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils = NULL;
701261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
701361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
701461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr) {
701561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Free input Heap Pointer");
701661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free (m_inp_heap_ptr);
701761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_heap_ptr = NULL;
701861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
701961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
702061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_phdr_pmem_ptr) {
702161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Free input pmem header Pointer");
702261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free (m_phdr_pmem_ptr);
702361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_phdr_pmem_ptr = NULL;
702461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
702561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
702661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr) {
702761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Free input pmem Pointer area");
702861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (m_inp_mem_ptr);
702961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_mem_ptr = NULL;
703061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
703161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_inputbuffer) {
703261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Free Driver Context pointer");
703361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_inputbuffer);
703461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer = NULL;
7035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info) {
7038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Free ion context");
703961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(drv_ctx.ip_buf_ion_info);
7040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ip_buf_ion_info = NULL;
7041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
70446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
70456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::stream_off(OMX_U32 port)
7046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
704761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enum v4l2_buf_type btype;
704861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
704961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enum v4l2_ports v4l2_port = OUTPUT_PORT;
705061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
705161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
705261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
705361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        v4l2_port = OUTPUT_PORT;
705461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
705561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
705661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        v4l2_port = CAPTURE_PORT;
705761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_ALL) {
705861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
705961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
706061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
706161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc_input)
706261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc_input;
706361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
706461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc_output;
706561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
706661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
706761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!streaming[v4l2_port]) {
706861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // already streamed off, warn and move on
706961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
707061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                " which is already streamed off", v4l2_port);
707161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return 0;
707261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
707361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
707461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
707561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
707661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
707761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
707861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
707961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port \n", v4l2_port);
708061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
708161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        streaming[v4l2_port] = false;
708261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
708361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
708461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
708561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
708661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
708761a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
708861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
708961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
709061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
709161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
709261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
709361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret = 0;
709461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
709561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.memory = V4L2_MEMORY_USERPTR;
709661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.count = 1;
709761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
709861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
709961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
710061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
710161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
710261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
710361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
710461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
710561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
710661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadParameter;
710761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
710861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet==OMX_ErrorNone) {
710961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
711061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
711161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
711261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
711361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
711461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
711561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
711661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
711761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->actualcount = bufreq.count;
711861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->mincount = bufreq.count;
711961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Count = %d \n ",bufreq.count);
712061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
712161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("GetBufReq: ActCnt(%d) Size(%d), BufType(%d)",
712261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
712361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
712461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
712561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
712661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
712761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
712861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
712961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height);
713061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
713161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
713261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Buffer Size (plane[0].sizeimage) = %d \n ",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
713361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
713461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
713561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
713661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
713761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
713861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
713961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int extra_idx = 0;
714061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
714161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size = buffer_prop->buffer_size;
714261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
714361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
714461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
714561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (extra_idx >= VIDEO_MAX_PLANES) {
714661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
714761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
714861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
714961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
715061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Frame info extra data enabled!");
715161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
715261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
715361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extradata & OMX_INTERLACE_EXTRADATA) {
715461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
715561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
715661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extradata & OMX_PORTDEF_EXTRADATA) {
715761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
715861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d\n",
715961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    client_extra_data_size);
716061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
716161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extra_data_size) {
716261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
716361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
716461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
716561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size;
716661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.count = buffer_prop->actualcount;
716761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.buffer_size = extra_data_size;
716861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size += client_extra_data_size;
716961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
717061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d)",
717161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type);
717261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (in_reconfig) // BufReq will be set to driver when port is disabled
717361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->buffer_size = buf_size;
717461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (buf_size != buffer_prop->buffer_size) {
717561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->buffer_size = buf_size;
717661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = set_buffer_req(buffer_prop);
717761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
717861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
717961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("GetBufReq OUT: ActCnt(%d) Size(%d), BufType(%d)\n",
718061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
718161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
718461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
718561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
718661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
718761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned buf_size = 0;
718861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
718961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
719061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret;
719161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
719261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size);
719361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
719461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buf_size != buffer_prop->buffer_size) {
719561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
719661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_prop->buffer_size, buf_size);
719761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadParameter;
719861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
719961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
720061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
720161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
720261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
720361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
720461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.pixelformat = output_capability;
720561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
720661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
720761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.pixelformat = capture_capability;
720861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
720961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
721061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
721161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
721261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
721361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
721461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
721561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
721661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
721761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
721861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
721961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
722061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.count = buffer_prop->actualcount;
722161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
722261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
722361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
722461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
722561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
722661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
722761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
722961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet==OMX_ErrorNone) {
723061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
723161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
723261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
723361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
723461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
723561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
723661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
723761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (bufreq.count < buffer_prop->actualcount) {
723861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
723961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    " on v4l2 port %d to %d (prefers %d)", bufreq.type,
724061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buffer_prop->actualcount, bufreq.count);
724161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
724261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
724361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!client_buffers.update_buffer_req()) {
724461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
724561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
724661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
724761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
724861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
724961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!eRet && buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
725061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // need to update extradata buffers also
725161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = buffer_prop->actualcount * drv_ctx.extradata_info.buffer_size;
725261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.count = buffer_prop->actualcount;
725361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
725461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7255dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
7256dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
7257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution()
7258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
725961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
726061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
7264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
726561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
726661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!portDefn) {
726761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
726861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
726961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("omx_vdec::update_portdef\n");
727061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
727161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->nSize = sizeof(portDefn);
727261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->eDomain    = OMX_PortDomainVideo;
727361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.frame_rate.fps_denominator > 0)
727461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
727561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.frame_rate.fps_denominator;
727661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
727761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Error: Divide by zero \n");
727861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
7279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
728061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (0 == portDefn->nPortIndex) {
728161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir =  OMX_DirInput;
728261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
728361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
728461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
728561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
728661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eCompressionFormat = eCompressionFormat;
728761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bEnabled   = m_inp_bEnabled;
728861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bPopulated = m_inp_bPopulated;
728961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (1 == portDefn->nPortIndex) {
729061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int buf_size = 0;
729161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.update_buffer_req()) {
729261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n client_buffers.update_buffer_req Failed");
729361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
729461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
729561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.get_buffer_req(buf_size)) {
729661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n update buffer requirements");
729761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
729861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
729961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferSize = buf_size;
730061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir =  OMX_DirOutput;
730161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
730261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
730361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
730461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bEnabled   = m_out_bEnabled;
730561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bPopulated = m_out_bPopulated;
730661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
730761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Error in getting color format");
730861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
730961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
731061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
731161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir = OMX_DirMax;
731261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
731361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (int)portDefn->nPortIndex);
731461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
731561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
731661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
731761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
731861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
731961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
732061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld"
732161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            " SliceHeight = %lu \n", portDefn->format.video.nFrameWidth,
732261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nFrameHeight,
732361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nStride,
732461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nSliceHeight);
732561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers()
7330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
733161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
733261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
733361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i= 0;
733461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
733561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
733661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Use o/p buffer case - Header List allocation");
733761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nBufHdrSize        = 0;
733861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformEntrySize = 0;
733961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformListSize  = 0;
734061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPMEMInfoSize = 0;
734161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
734261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
734361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
734461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
734561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Setting First Output Buffer(%d)\n",
734661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
734761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufHdrSize        = drv_ctx.op_buf.actualcount *
734861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE);
734961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
735061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
735161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
735261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformListSize  = drv_ctx.op_buf.actualcount *
735361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
735461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
735561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
735661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
735761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d\n",nBufHdrSize,
735861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof(OMX_BUFFERHEADERTYPE),
735961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,
736061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPlatformListSize);
736161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("PE %d bmSize %d \n",nPlatformEntrySize,
736261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_bm_count);
736361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
736461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Alloc mem for platform specific info
736561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *pPtr=NULL;
736661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
736761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,1);
736861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
736961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   calloc (sizeof(struct vdec_bufferpayload),
737061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.op_buf.actualcount);
737161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
737261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 calloc (sizeof (struct vdec_output_frameinfo),
737361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         drv_ctx.op_buf.actualcount);
7374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
737561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
737661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
7377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
737961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
738061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && drv_ctx.ptr_respbuffer) {
738161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufHdr          =  m_out_mem_ptr;
738261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
738361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
738461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_list)  + nPlatformListSize);
738561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
738661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_entry) + nPlatformEntrySize);
738761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformList   = m_platform_list;
738861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformEntry  = m_platform_entry;
738961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPMEMInfo       = m_pmem_info;
739061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
739161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p\n",m_out_mem_ptr);
739261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
739361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Settting the entire storage nicely
739461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p\n",bufHdr,
739561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr,pPlatformEntry);
739661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW(" Pmem Info = %p \n",pPMEMInfo);
739761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
739861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
739961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
740061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Set the values when we determine the right HxW param
740161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nAllocLen          = 0;
740261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nFilledLen         = 0;
740361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pAppPrivate        = NULL;
740461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
740561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
740661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->entry      = pPMEMInfo;
740761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform List
740861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->nEntries    = 1;
740961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->entryList   = pPlatformEntry;
741061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep pBuffer NULL till vdec is opened
741161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pBuffer            = NULL;
741261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->offset          =  0;
741361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->pmem_fd = 0;
741461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pPlatformPrivate = pPlatformList;
741561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
7416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
741761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
7418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
741961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Create a mapping between buffers*/
742061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
742161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer[i].client_data = (void *) \
742261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        &drv_ctx.ptr_outputbuffer[i];
742361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Move the buffer and buffer header pointers
742461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr++;
742561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo++;
742661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry++;
742761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList++;
742861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
742961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
743061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]\n",\
743161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr, pPtr);
743261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_out_mem_ptr) {
743361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_out_mem_ptr);
743461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr = NULL;
743561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
743661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pPtr) {
743761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(pPtr);
743861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPtr = NULL;
743961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
744061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer) {
744161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_outputbuffer);
744261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer = NULL;
744361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
744461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_respbuffer) {
744561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_respbuffer);
744661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer = NULL;
744761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
7448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
744961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.op_buf_ion_info) {
745061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n Free o/p ion context");
745161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.op_buf_ion_info);
745261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info = NULL;
745361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
7454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
745561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet =  OMX_ErrorInsufficientResources;
745661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
745761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
745861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet =  OMX_ErrorInsufficientResources;
7459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
746061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs()
7464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
746561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned p1;
746661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned p2;
746761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned ident;
746861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_cmd_queue tmp_q, pending_bd_q;
746961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
747061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // pop all pending GENERATE FDB from ftb queue
747161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_ftb_q.m_size) {
747261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.pop_entry(&p1,&p2,&ident);
747361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_FBD) {
747461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_bd_q.insert_entry(p1,p2,ident);
747561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
747661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            tmp_q.insert_entry(p1,p2,ident);
747761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
747961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //return all non GENERATE FDB to ftb queue
748061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (tmp_q.m_size) {
748161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        tmp_q.pop_entry(&p1,&p2,&ident);
748261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.insert_entry(p1,p2,ident);
748361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
748461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // pop all pending GENERATE EDB from etb queue
748561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_etb_q.m_size) {
748661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.pop_entry(&p1,&p2,&ident);
748761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_EBD) {
748861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_bd_q.insert_entry(p1,p2,ident);
748961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
749061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            tmp_q.insert_entry(p1,p2,ident);
749161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
749261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
749361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //return all non GENERATE FDB to etb queue
749461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (tmp_q.m_size) {
749561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        tmp_q.pop_entry(&p1,&p2,&ident);
749661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.insert_entry(p1,p2,ident);
749761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
749861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
749961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // process all pending buffer dones
750061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (pending_bd_q.m_size) {
750161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pending_bd_q.pop_entry(&p1,&p2,&ident);
750261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (ident) {
750361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_COMPONENT_GENERATE_EBD:
750461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
750561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: empty_buffer_done() failed!\n");
750661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
750761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
750861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
750961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
751061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_COMPONENT_GENERATE_FBD:
751161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
751261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: fill_buffer_done() failed!\n");
751361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
751461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
751561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
751661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
7521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
752261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 new_frame_interval = 0;
752361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
752461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) {
752561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        new_frame_interval = (act_timestamp > prev_ts)?
752661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            act_timestamp - prev_ts :
752761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts - act_timestamp;
752861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (new_frame_interval < frm_int || frm_int == 0) {
752961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frm_int = new_frame_interval;
753061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (frm_int) {
753161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.frame_rate.fps_numerator = 1e6;
753261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.frame_rate.fps_denominator = frm_int;
753361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
753461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frm_int, drv_ctx.frame_rate.fps_numerator /
753561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (float)drv_ctx.frame_rate.fps_denominator);
753661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
753761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
753861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
753961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prev_ts = act_timestamp;
7540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
7543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
754461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rst_prev_ts && VALID_TS(act_timestamp)) {
754561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = act_timestamp;
754661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = false;
754761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (VALID_TS(prev_ts)) {
754861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool codec_cond = (drv_ctx.timestamp_adjust)?
754961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
755061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
755161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
755261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (frm_int > 0 && codec_cond) {
755361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
755461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            act_timestamp = prev_ts + frm_int;
755561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
755661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts = act_timestamp;
755761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
755861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            set_frame_rate(act_timestamp);
755961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (frm_int > 0)          // In this case the frame rate was set along
756061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    {                               // with the port definition, start ts with 0
756161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
756261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
7563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
7567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
756861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
756961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_conceal_MB = 0;
757061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 frame_rate = 0;
757161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int consumed_len = 0;
757261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_MB_in_frame;
757361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 recovery_sei_flags = 1;
757461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int buf_index = p_buf_hdr - m_out_mem_ptr;
757561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
757661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
757761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        p_buf_hdr->nOffset;
757861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!drv_ctx.extradata_info.uaddr) {
757961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
758061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
758161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    p_extra = (OMX_OTHER_EXTRADATATYPE *)
758261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
758361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
758461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
758561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        p_extra = NULL;
758661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
758761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (data) {
758861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while ((consumed_len < drv_ctx.extradata_info.buffer_size)
758961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && (data->eType != (OMX_EXTRADATATYPE)EXTRADATA_NONE)) {
759061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) {
759161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("Invalid extra data size");
759261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
759361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
759461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch ((unsigned long)data->eType) {
759561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case EXTRADATA_INTERLACE_VIDEO:
759661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_interlace_payload *payload;
759761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    payload = (struct msm_vidc_interlace_payload *)data->data;
759861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (payload->format != INTERLACE_FRAME_PROGRESSIVE) {
759961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        int enable = 1;
760061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_U32 mbaff = 0;
760161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
760261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ((payload->format == INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
760361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
760461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        else
760561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
760661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (m_enable_android_native_buffers)
760761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
760861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    PP_PARAM_INTERLACED, (void*)&enable);
760961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
761061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) {
761161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        append_interlace_extradata(p_extra, payload->format);
761261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
761361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
761461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
761561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case EXTRADATA_FRAME_RATE:
761661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_framerate_payload *frame_rate_payload;
761761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data;
761861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    frame_rate = frame_rate_payload->frame_rate;
761961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
762061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case EXTRADATA_TIMESTAMP:
762161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_ts_payload *time_stamp_payload;
762261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    time_stamp_payload = (struct msm_vidc_ts_payload *)data->data;
762361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo;
762461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
762561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
762661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case EXTRADATA_NUM_CONCEALED_MB:
762761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_concealmb_payload *conceal_mb_payload;
762861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data;
762961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
763061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
763161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
763261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
763361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case EXTRADATA_ASPECT_RATIO:
763461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
763561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)data->data;
763661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((struct vdec_output_frameinfo *)
763761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
763861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((struct vdec_output_frameinfo *)
763961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
764061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
764161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case EXTRADATA_RECOVERY_POINT_SEI:
764261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_recoverysei_payload *recovery_sei_payload;
764361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data;
764461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    recovery_sei_flags = recovery_sei_payload->flags;
764561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (recovery_sei_flags != FRAME_RECONSTRUCTION_CORRECT) {
764661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
764761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_HIGH("Extradata: OMX_BUFFERFLAG_DATACORRUPT Received\n");
764861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
764961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
765061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case EXTRADATA_PANSCAN_WINDOW:
765161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data;
765261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
765361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
765461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    goto unrecognized_extradata;
765561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
765661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            consumed_len += data->nSize;
765761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
765861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
765961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
766061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
766161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            append_frame_info_extradata(p_extra,
766261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
766361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    panscan_payload,&((struct vdec_output_frameinfo *)
766461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
766561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
766661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
76676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalunrecognized_extradata:
766861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!secure_mode && client_extradata)
766961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        append_terminator_extradata(p_extra);
767061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
7671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
76736eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
767461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool is_internal, bool enable)
7675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
767661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
767761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
767861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state != OMX_StateLoaded) {
767961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
768061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
768161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
768261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d\n",
768361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata, requested_extradata, enable, is_internal);
768461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
768561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!is_internal) {
768661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (enable)
768761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata |= requested_extradata;
768861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
768961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata = client_extradata & ~requested_extradata;
769061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
769161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
769261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enable) {
769361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
769461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
769561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
769661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
769761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
769861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        " Quality of interlaced clips might be impacted.\n");
769961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
770061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) {
770161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
770261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
770361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
770461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set framerate extradata\n");
770561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
770661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
770761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
770861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
770961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set concealed MB extradata\n");
771061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
771161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
771261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
771361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
771461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata\n");
771561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
771661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
771761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
771861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
771961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
772061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
772161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
772261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_INDEX_EXTRADATA_ASPECT_RATIO;
772361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
772461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set panscan extradata\n");
772561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
772661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
772761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
772861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
772961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
773061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set timeinfo extradata\n");
773161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
773261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
773361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
773461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = get_buffer_req(&drv_ctx.op_buf);
773561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
7736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
774061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
774161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *data_ptr = extra->data, data = 0;
774261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (byte_count < extra->nDataSize) {
774361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        data = *data_ptr;
774461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (data) {
774561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            num_MB += (data&0x01);
774661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            data >>= 1;
774761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
774861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        data_ptr++;
774961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        byte_count++;
775061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
775161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
775261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
775361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
7754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
775861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_debug_extradata)
775961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
7760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
776261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "============== Extra Data ==============\n"
776361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "           Size: %lu \n"
776461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "        Version: %lu \n"
776561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "      PortIndex: %lu \n"
776661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "           Type: %x \n"
776761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "       DataSize: %lu \n",
776861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra->nSize, extra->nVersion.nVersion,
776961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra->nPortIndex, extra->eType, extra->nDataSize);
777061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
777161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) {
777261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
777361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH(
777461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "------ Interlace Format ------\n"
777561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "                Size: %lu \n"
777661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "             Version: %lu \n"
777761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "           PortIndex: %lu \n"
777861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                " Is Interlace Format: %d \n"
777961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "   Interlace Formats: %lu \n"
778061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "=========== End of Interlace ===========\n",
778161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
778261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
778361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) {
778461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
778561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
778661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH(
778761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "-------- Frame Format --------\n"
778861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "             Picture Type: %d \n"
778961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "           Interlace Type: %d \n"
779061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                " Pan Scan Total Frame Num: %lu \n"
779161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "   Concealed Macro Blocks: %lu \n"
779261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "               frame rate: %lu \n"
779361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "           Aspect Ratio X: %lu \n"
779461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "           Aspect Ratio Y: %lu \n",
779561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->ePicType,
779661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->interlaceType,
779761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->panScan.numWindows,
779861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->nConcealedMacroblocks,
779961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->nFrameRate,
780061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->aspectRatio.aspectRatioX,
780161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->aspectRatio.aspectRatioY);
780261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
780361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) {
780461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH(
780561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "------------------------------\n"
780661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "     Pan Scan Frame Num: %lu \n"
780761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "            Rectangle x: %ld \n"
780861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "            Rectangle y: %ld \n"
780961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "           Rectangle dx: %ld \n"
781061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "           Rectangle dy: %ld \n",
781161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
781261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
781361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
781461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
781561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
781661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra->eType == OMX_ExtraDataNone) {
781761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("========== End of Terminator ===========");
781861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
781961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
782061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
782461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 interlaced_format_type)
7825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
782661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_STREAMINTERLACEFORMAT *interlace_format;
782761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 mbaff = 0;
782861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
782961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
783061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
783161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
783261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
783361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
783461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
783561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
783661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
783761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
783861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
783961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
784061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
784161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((interlaced_format_type == INTERLACE_FRAME_PROGRESSIVE)  && !mbaff) {
784261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->bInterlaceFormat = OMX_FALSE;
784361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
784461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
784561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
784661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->bInterlaceFormat = OMX_TRUE;
784761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
784861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
784961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
785061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
7851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
78536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::fill_aspect_ratio_info(
785461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct vdec_aspectratioinfo *aspect_ratio_info,
785561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
78566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
785761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata = frame_info;
785861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
785961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
786061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX,
786161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_extradata->aspectRatio.aspectRatioY);
78626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
7863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
786561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
78666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        struct msm_vidc_panscan_window_payload *panscan_payload,
78676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        struct vdec_aspectratioinfo *aspect_ratio_info)
7868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
786961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
787061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct msm_vidc_panscan_window *panscan_window;
787161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
78726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        return;
787361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
787461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
787561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
787661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
787761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
787861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
787961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
788061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (picture_type) {
788161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_I:
788261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeI;
788361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
788461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_P:
788561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeP;
788661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
788761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_B:
788861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeB;
788961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
789061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
789161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
789261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
789361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
789461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
789561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
789661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
789761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
789861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
789961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
790061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->nConcealedMacroblocks = num_conceal_mb;
790161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->nFrameRate = frame_rate;
790261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->panScan.numWindows = 0;
790361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (panscan_payload) {
790461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
790561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        panscan_window = &panscan_payload->wnd[0];
790661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) {
790761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
790861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
790961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
791061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
791161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            panscan_window++;
791261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
791361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
791461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fill_aspect_ratio_info(aspect_ratio_info, frame_info);
791561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
7916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
792061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
792161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
792261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
792361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
792461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
792561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
792661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
792761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *portDefn = m_port_def;
792861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
792961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "sliceheight = %u \n",portDefn->format.video.nFrameHeight,
793061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nFrameWidth,
793161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nStride,
793261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nSliceHeight);
7933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
793761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!client_extradata) {
793861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
793961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
794061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
794161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
794261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = OMX_ExtraDataNone;
794361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = 0;
794461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->data[0] = 0;
794561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
794661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
7947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
7950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
795161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
795261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index >= drv_ctx.ip_buf.actualcount) {
795361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR:Desc Buffer Index not found");
795461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
795561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
795661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr == NULL) {
795761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_desc_buffer_ptr = (desc_buffer_hdr*) \
795861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            calloc( (sizeof(desc_buffer_hdr)),
795961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    drv_ctx.ip_buf.actualcount);
796061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_desc_buffer_ptr == NULL) {
796161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n m_desc_buffer_ptr Allocation failed ");
796261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
796361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
796461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
796561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
796661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
796761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr[index].buf_addr == NULL) {
796861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\ndesc buffer Allocation failed ");
796961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
797061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
797161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
797261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
7976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
797761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
797861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_demux_entries < 8192) {
797961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_offsets[m_demux_entries++] = address_offset;
798061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
798161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
7982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
7985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
798661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
798761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
798861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 index = 0;
798961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
799061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
799161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
799261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (index < bytes_to_parse) {
799361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
799461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
799561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
799661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 (buf[index+2] == 0x01)) ) {
799761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //Found start code, insert address offset
799861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            insert_demux_addr_offset(index);
799961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buf[index+2] == 0x01) // 3 byte start code
800061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index += 3;
800161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else                      //4 byte start code
800261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index += 4;
800361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
800461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            index++;
8005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
800661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
800761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
8008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
8011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
801261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //fix this, handle 3 byte start code, vc1 terminator entry
801361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *p_demux_data = NULL;
801461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 desc_data = 0;
801561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 start_addr = 0;
801661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 nal_size = 0;
801761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 suffix_byte = 0;
801861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 demux_index = 0;
801961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 buffer_index = 0;
802061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
802161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr == NULL) {
802261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
802361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
802461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
802561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
802661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
802761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_index > drv_ctx.ip_buf.actualcount) {
802861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index);
802961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
803061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
803161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
803261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
803361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
803461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ( ((OMX_U8*)p_demux_data == NULL) ||
803561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
803661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
803761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
803861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
803961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; demux_index < m_demux_entries; demux_index++) {
804061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0;
804161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            start_addr = m_demux_offsets[demux_index];
804261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
804361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
804461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
804561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
804661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
804761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (demux_index < (m_demux_entries - 1)) {
804861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
804961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
805061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
805161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
805261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
805361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    start_addr,
805461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    suffix_byte,
805561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    nal_size,
805661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    demux_index);
805761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = (start_addr >> 3) << 1;
805861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data |= (start_addr & 7) << 21;
805961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data |= suffix_byte << 24;
806061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
806161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
806261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
806361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
806461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
806561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
806661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_demux_data += 16;
806761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
806861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_type_parse == CODEC_TYPE_VC1) {
806961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("VC1 terminator entry");
807061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0;
807161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0x82 << 24;
807261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
807361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 4, 0, sizeof(OMX_U32));
807461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
807561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
807661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_demux_data += 16;
807761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_demux_entries++;
807861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
807961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //Add zero word to indicate end of descriptors
808061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(p_demux_data, 0, sizeof(OMX_U32));
808161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
808261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
808361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
808461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
808561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
808661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
808761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Demux table complete!");
808861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
8089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
80916eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::createDivxDrmContext()
8092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
809361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE err = OMX_ErrorNone;
809461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    iDivXDrmDecrypt = DivXDrmDecrypt::Create();
809561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (iDivXDrmDecrypt) {
809661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
809761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (err!=OMX_ErrorNone) {
80986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            DEBUG_PRINT_ERROR("\nERROR :iDivXDrmDecrypt->Init %d", err);
8099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            delete iDivXDrmDecrypt;
8100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            iDivXDrmDecrypt = NULL;
810161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
810261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
810361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nUnable to Create DIVX DRM");
810461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        err = OMX_ErrorUndefined;
810561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
810661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return err;
8107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
81086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
81096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
81106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
811161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enabled = false;
811261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = NULL;
811361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    init_members();
811461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ColorFormat = OMX_COLOR_FormatMax;
81156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
81176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
81186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
811961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = reinterpret_cast<omx_vdec*>(client);
81206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
812261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::allocate_color_convert_buf::init_members()
812361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
812461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocated_count = 0;
812561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_size_req = 0;
812661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_alignment_req = 0;
812761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_platform_list_client,0,sizeof(m_platform_list_client));
812861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
812961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
813061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
81316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
813261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
81336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
813461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (int i = 0; i < MAX_COUNT; i++)
813561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd[i] = -1;
81366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
813861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
813961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
814061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    c2d.destroy();
81416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
81436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::update_buffer_req()
81446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
814561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
814661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int src_size = 0, destination_size = 0;
814761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_COLOR_FORMATTYPE drv_color_format;
814861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
814961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Invalid client in color convert");
815061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
815161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
815261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
815361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n No color conversion required");
815461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return status;
815561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
815661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
815761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
815861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ColorFormat != OMX_COLOR_FormatYUV420Planar) {
815961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nupdate_buffer_req: Unsupported color conversion");
816061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = false;
816161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        goto fail_update_buf_req;
816261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
816361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    c2d.close();
816461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
816561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->drv_ctx.video_resolution.frame_width,
816661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            NV12_128m,YCbCr420P);
816761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
816861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = c2d.get_buffer_size(C2D_INPUT,src_size);
816961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (status)
817061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
817161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
817261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
817361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
817461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                !destination_size) {
817561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\nERROR: Size mismatch in C2D src_size %d"
817661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "driver size %d destination size %d",
817761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
817861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
817961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            c2d.close();
818061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req = 0;
818161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
818261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req = destination_size;
818361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
818461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
818561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
818661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
818761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
81886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
81896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_update_buf_req:
819061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
819161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
81926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
81946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::set_color_format(
819561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_COLOR_FORMATTYPE dest_color_format)
81966eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
819761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
819861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_COLOR_FORMATTYPE drv_color_format;
819961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
820061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Invalid client in color convert");
820161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
820261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
820361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
820461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
820561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_color_format = (OMX_COLOR_FORMATTYPE)
820661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
820761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
820861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Incorrect color format");
82096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        status = false;
82106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
821161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status && (drv_color_format != dest_color_format)) {
821261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Enabling C2D\n");
821361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
821461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Unsupported color format for c2d");
821561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
821661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
821761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ColorFormat = OMX_COLOR_FormatYUV420Planar;
821861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (enabled)
821961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                c2d.destroy();
822061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            enabled = false;
822161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!c2d.init()) {
822261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n open failed for c2d");
822361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
822461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else
822561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                enabled = true;
822661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
822761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
822861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (enabled)
822961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            c2d.destroy();
823061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enabled = false;
823161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
823261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
823361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
82346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
82366eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
82376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
823861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
823961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
824061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
824161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
824261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
824361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return omx->m_out_mem_ptr;
824461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return m_out_mem_ptr_client;
82456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
824761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
824861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd)
82496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
825061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
825161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
825261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
825361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
825461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
825561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bufadd;
825661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
825761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned index = 0;
825861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufadd - omx->m_out_mem_ptr;
825961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < omx->drv_ctx.op_buf.actualcount) {
826061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
826161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
826261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool status;
826361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
826461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pthread_mutex_lock(&omx->c_lock);
826561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
826661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer,pmem_fd[index],
826761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_baseaddress[index], pmem_baseaddress[index]);
826861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pthread_mutex_unlock(&omx->c_lock);
826961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
827061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!status) {
827161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n Failed color conversion %d", status);
827261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr_client[index].nFilledLen = 0;
827361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return &m_out_mem_ptr_client[index];
827461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
827561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
827661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_mem_ptr_client[index].nFilledLen = 0;
82776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        return &m_out_mem_ptr_client[index];
827861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
827961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_ERROR("\n Index messed up in the get_il_buf_hdr");
828061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
82816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
828361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
828461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd)
82856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
828661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
828761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Invalid param get_buf_hdr");
828861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
828961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
829061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
829161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bufadd;
829261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned index = 0;
829361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufadd - m_out_mem_ptr_client;
829461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < omx->drv_ctx.op_buf.actualcount) {
829561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return &omx->m_out_mem_ptr[index];
829661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
829761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_ERROR("\n Index messed up in the get_dr_buf_hdr");
82986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return NULL;
82996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
830061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool omx_vdec::allocate_color_convert_buf::get_buffer_req
830161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(unsigned int &buffer_size)
83026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
830361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
830461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
830561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
830661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_size = omx->drv_ctx.op_buf.buffer_size;
830761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
830861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
830961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Get buffer size failed");
831061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
831161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            goto fail_get_buffer_size;
831261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
831361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
831461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
83156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        buffer_size = omx->drv_ctx.op_buf.buffer_size;
831661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
831761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
83186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_get_buffer_size:
831961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
832061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
83216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
83226eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
832361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *bufhdr)
832461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
832561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
832661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
832761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
832861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return omx->free_output_buffer(bufhdr);
832961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enabled && omx->is_component_secure())
833061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
833161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!allocated_count || !bufhdr) {
833261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Color convert no buffer to be freed %p",bufhdr);
833361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
833461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
833561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufhdr - m_out_mem_ptr_client;
833661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index >= omx->drv_ctx.op_buf.actualcount) {
833761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Incorrect index color convert free_output_buffer");
833861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
833961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
834061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_fd[index] > 0) {
834161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        munmap(pmem_baseaddress[index], buffer_size_req);
834261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(pmem_fd[index]);
834361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
834461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd[index] = -1;
83456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
834661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx->free_ion_memory(&op_buf_ion_info[index]);
8347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
834861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr[index].video_heap_ptr = NULL;
834961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocated_count > 0)
835061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocated_count--;
835161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
835261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocated_count = 0;
835361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!allocated_count) {
835461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&omx->c_lock);
835561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        c2d.close();
835661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        init_members();
835761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&omx->c_lock);
835861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
835961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
83606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
8361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
83626eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
836361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
83646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
836561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
836661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
836761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
836861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
836961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
837061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enabled && omx->is_component_secure()) {
837161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nNotin color convert mode secure_mode %d",
837261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->is_component_secure());
837361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorUnsupportedSetting;
837461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
837561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!bufferHdr || bytes > buffer_size_req) {
837661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Invalid params allocate_buffers_color_convert %p", bufferHdr);
837761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n color_convert buffer_size_req %d bytes %lu",
837861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_size_req,bytes);
837961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
838061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
838161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
838261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Actual count err in allocate_buffers_color_convert");
838361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
838461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
838561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
838661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
838761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            port,appData,omx->drv_ctx.op_buf.buffer_size);
838861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
838961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Buffer allocation failed color_convert");
839061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
839161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
839261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
839361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->drv_ctx.op_buf.actualcount) {
839461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Invalid header index %d",
839561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (temp_bufferHdr - omx->m_out_mem_ptr));
839661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorUndefined;
839761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
839861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int i = allocated_count;
83996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
840061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
840161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req,buffer_alignment_req,
840261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
840361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            0);
840461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
840561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (op_buf_ion_info[i].ion_device_fd < 0) {
840661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n alloc_map_ion failed in color_convert");
840761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
840861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
840961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
841061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
841161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
841261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_baseaddress[i] == MAP_FAILED) {
841361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n MMAP failed for Size %d",buffer_size_req);
841461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(pmem_fd[i]);
841561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        omx->free_ion_memory(&op_buf_ion_info[i]);
841661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
841761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
841861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr[i].video_heap_ptr = new VideoHeap (
841961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            op_buf_ion_info[i].ion_device_fd,buffer_size_req,
842061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
84216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
842261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
842361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info_client[i].offset = 0;
842461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
842561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
842661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list_client[i].nEntries = 1;
842761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
842861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
842961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
843061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nFilledLen = 0;
843161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nFlags = 0;
843261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
843361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
843461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
843561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
843661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
843761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pAppPrivate = appData;
843861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *bufferHdr = &m_out_mem_ptr_client[i];
843961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_ERROR("\n IL client buffer header %p", *bufferHdr);
844061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocated_count++;
844161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
84426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
84436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
84446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::is_component_secure()
84456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
844661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return secure_mode;
84476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
84486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
84496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
84506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
845161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
845261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
845361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
845461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dest_color_format =  (OMX_COLOR_FORMATTYPE)
845561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
845661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
845761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
845861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
845961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
846061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
846161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
846261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dest_color_format = OMX_COLOR_FormatYUV420Planar;
846361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
846461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
84656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
8466